如何用Python实现按文件类型/扩展名排序后跨目录移动文件
Python按文件扩展名/类型排序移动文件实现方案
核心实现逻辑
整个功能可以拆分为4个步骤实现,仅依赖Python标准库,无需安装第三方依赖:
- 遍历源目录下的所有目标文件,可按需选择是否递归遍历子目录
- 为每个文件提取排序用的特征键(扩展名/自定义文件类型)
- 调用
sorted()方法按特征键对文件列表排序 - 按排序后的顺序执行移动操作,可增加重名冲突处理逻辑避免覆盖文件
代码示例
按扩展名排序移动
import os import shutil from pathlib import Path def move_sorted_by_ext(source_dir: str, target_dir: str) -> None: # 校验源目录合法性 if not os.path.isdir(source_dir): raise NotADirectoryError(f"源目录 {source_dir} 不存在") # 自动创建不存在的目标目录 Path(target_dir).mkdir(parents=True, exist_ok=True) # 提取源目录下所有文件(不包含子目录,需要递归的话把iterdir换成rglob("*")) file_list = [f for f in Path(source_dir).iterdir() if f.is_file()] # 按扩展名小写排序,需要降序的话增加reverse=True参数 sorted_files = sorted(file_list, key=lambda x: x.suffix.lower()) # 逐个执行移动 for file in sorted_files: target_path = os.path.join(target_dir, file.name) # 重名文件处理,自动加序号后缀 counter = 1 while os.path.exists(target_path): target_path = os.path.join(target_dir, f"{file.stem}_{counter}{file.suffix}") counter += 1 shutil.move(str(file), target_path) print(f"移动完成:{file.name} -> {target_path}")
按自定义文件类型排序移动
首先提前定义文件类型映射和排序优先级,可根据自己的需求增删调整:
# 自定义扩展名与文件类型的映射关系 TYPE_MAPPING = { "图片": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"], "文档": [".doc", ".docx", ".pdf", ".txt", ".xls", ".xlsx", ".ppt", ".pptx", ".md"], "视频": [".mp4", ".avi", ".mov", ".mkv", ".flv"], "音频": [".mp3", ".wav", ".flac", ".aac"], "压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"] } # 类型排序优先级,未匹配到的文件统一归为「其他」,排在最后 TYPE_ORDER = ["图片", "文档", "视频", "音频", "压缩包", "其他"] def get_file_type(file_suffix: str) -> str: suffix = file_suffix.lower() for type_name, ext_list in TYPE_MAPPING.items(): if suffix in ext_list: return type_name return "其他" def move_sorted_by_type(source_dir: str, target_dir: str) -> None: if not os.path.isdir(source_dir): raise NotADirectoryError(f"源目录 {source_dir} 不存在") Path(target_dir).mkdir(parents=True, exist_ok=True) file_list = [f for f in Path(source_dir).iterdir() if f.is_file()] # 按类型优先级排序,同类型下可再加扩展名排序:key=lambda x: (TYPE_ORDER.index(get_file_type(x.suffix)), x.suffix.lower()) sorted_files = sorted(file_list, key=lambda x: TYPE_ORDER.index(get_file_type(x.suffix))) for file in sorted_files: target_path = os.path.join(target_dir, file.name) counter = 1 while os.path.exists(target_path): target_path = os.path.join(target_dir, f"{file.stem}_{counter}{file.suffix}") counter += 1 shutil.move(str(file), target_path) print(f"移动完成:{file.name} -> {target_path}")
使用说明
- 调用方法非常简单,直接传入源目录和目标目录路径即可,比如
move_sorted_by_ext("./下载", "./整理后的文件") - 正式执行移动前,可先把
shutil.move替换为print语句打印移动路径,确认排序逻辑符合预期后再实际执行 - 如果需要调整排序规则,仅修改
sorted()方法的key参数即可,比如按文件大小、修改时间排序都可以直接调整key实现
内容的提问来源于stack exchange,提问作者DioOnAir
相关产品推荐
相关产品推荐

