如何用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
相关产品推荐
相关产品推荐

