You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python自动整理下载文件夹?现有代码需优化

自动整理下载文件夹的Python脚本优化

我的下载文件夹常年杂乱不堪,PDF、图片、视频、压缩包等各类文件散落各处,手动整理太耗费精力,于是用Python写了个自动整理脚本。目前脚本能正常运行,但可以从多个维度优化:

优化后的完整代码

import os
import shutil
from pathlib import Path

# 基础路径定义,使用Path类简化路径操作
DOWNLOADS_FOLDER = Path('/home/khushwant/Downloads')
MEDIA_FOLDER = DOWNLOADS_FOLDER / 'Media'
FILES_FOLDER = DOWNLOADS_FOLDER / 'Files'

# 子文件夹路径
IMAGE_FOLDER = MEDIA_FOLDER / 'Images'
VIDEO_FOLDER = MEDIA_FOLDER / 'Videos'
AUDIO_FOLDER = MEDIA_FOLDER / 'Audio'

# 批量创建所需文件夹,parents=True自动创建父目录,exist_ok=True忽略已存在的文件夹
folders = [FILES_FOLDER, MEDIA_FOLDER, IMAGE_FOLDER, VIDEO_FOLDER, AUDIO_FOLDER]
for folder in folders:
    folder.mkdir(parents=True, exist_ok=True)

# 扩展名-目标文件夹映射,单扩展名对应更高效
extension_mapping = {
    # 视频格式
    '.mp4': VIDEO_FOLDER,
    '.avi': VIDEO_FOLDER,
    '.flv': VIDEO_FOLDER,
    '.mov': VIDEO_FOLDER,
    '.mkv': VIDEO_FOLDER,
    # 音频格式
    '.mp3': AUDIO_FOLDER,
    '.wav': AUDIO_FOLDER,
    '.aac': AUDIO_FOLDER,
    # 图片格式
    '.jpg': IMAGE_FOLDER,
    '.jpeg': IMAGE_FOLDER,
    '.png': IMAGE_FOLDER,
    '.gif': IMAGE_FOLDER,
    # 其他文件(含原需求的PDF)
    '.zip': FILES_FOLDER,
    '.tar': FILES_FOLDER,
    '.gz': FILES_FOLDER,
    '.xlsx': FILES_FOLDER,
    '.pth': FILES_FOLDER,
    '.tgz': FILES_FOLDER,
    '.tar.xz': FILES_FOLDER,
    '.pdf': FILES_FOLDER
}

def get_unique_dest_path(src_path, dest_folder):
    """生成不重复的目标文件路径,避免覆盖已有文件"""
    dest_path = dest_folder / src_path.name
    if not dest_path.exists():
        return dest_path
    
    base_name = src_path.stem
    extension = src_path.suffix
    counter = 1
    while True:
        new_name = f"{base_name}_{counter}{extension}"
        dest_path = dest_folder / new_name
        if not dest_path.exists():
            return dest_path
        counter += 1

def move_file(src_path, dest_folder):
    """执行文件移动操作,处理异常情况"""
    try:
        dest_path = get_unique_dest_path(src_path, dest_folder)
        shutil.move(str(src_path), str(dest_path))
        print(f"已移动: {src_path} → {dest_path}")
    except Exception as e:
        print(f"移动失败 {src_path}: {e}")

def sort_downloads():
    """遍历下载文件夹,按扩展名分类移动文件"""
    for item in DOWNLOADS_FOLDER.iterdir():
        # 跳过文件夹和脚本自身(若脚本放在下载文件夹内)
        if item.is_dir() or item.name == os.path.basename(__file__):
            continue
        
        # 统一转为小写扩展名,避免大小写匹配问题
        ext = item.suffix.lower()
        # 查找目标文件夹,无匹配则默认归入Files
        dest_folder = extension_mapping.get(ext, FILES_FOLDER)
        move_file(item, dest_folder)

if __name__ == "__main__":
    sort_downloads()

主要优化点

  • 路径管理简化:用pathlib.Path替代os.path系列方法,路径拼接更直观,减少字符串操作错误。
  • 冗余代码清理:删除重复的文件夹创建逻辑,mkdir(parents=True, exist_ok=True)可一键创建多级目录,无需额外捕获FileExistsError。
  • 匹配效率提升:将原有的多扩展名元组映射改为单扩展名映射,避免循环遍历所有扩展名组,查找速度更快。
  • 功能补全:添加了原需求中提到的PDF文件分类,覆盖所有提及的文件类型。
  • 代码结构拆分:把重名处理逻辑独立为get_unique_dest_path函数,职责更清晰,代码可读性更强。
  • 鲁棒性增强:增加跳过脚本自身的判断,防止脚本被误移动;统一转为小写扩展名,避免因扩展名大小写导致的匹配失败。
  • 命名规范统一:修正原代码中FILE_FOLDER与FILES_FOLDER的命名不一致问题,保持变量名统一。

内容的提问来源于stack exchange,提问作者khushwant singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:44:55