Python处理JPG文件的多下划线检测移动逻辑编写及脚本优化求助
JPG文件分类逻辑实现与代码优化
现有代码存在的问题
- 路径处理不规范:混用
pathlib、os.path.join和字符串拼接反斜杠,容易触发转义错误,不同系统兼容性差 - 循环逻辑冗余:遍历目录条目时每遇到一个文件就切换工作目录、全量扫描一次jpg文件,会重复执行操作,运行效率极低
- 缺少错误目录初始化:移动文件到错误文件夹前没有提前创建目录,会触发路径不存在的报错
- 需求逻辑缺失:当前下划线数量判断只作用于文件夹,完全没有对jpg文件的下划线数量做校验
- 目录创建没有容错:如果同名分类目录已经存在,
os.mkdir会直接报错
需求实现逻辑
你需要的「下划线超过1个的jpg移入错误文件夹」逻辑可以按以下步骤实现:
- 提前初始化工作目录、错误目录路径,提前创建错误目录避免移动时报错
- 统一用
pathlib处理所有路径,避免字符串拼接的转义问题 - 单次遍历目标目录下所有jpg文件,先校验下划线数量:
- 下划线数量>1:直接移动到错误目录
- 下划线数量符合要求:执行原有的分类逻辑,替换空格后创建同名目录移入文件
- 所有目录创建都增加
exist_ok=True参数,避免重复创建报错
优化后完整代码
from pathlib import Path import shutil import time # 时间戳生成 timestr = time.strftime("%Y%m%d-%H%M%S") # 路径配置(用原始字符串避免反斜杠转义,全程用Path对象处理) base_folder = Path(r'D:\test\testing') working_folder = base_folder / 'DitaTest1' # 错误文件夹路径 error_folder = base_folder / f'DitaTest1 - dir-ERRORS_{timestr}' # 提前创建错误文件夹 error_folder.mkdir(exist_ok=True, parents=True) # 遍历工作目录下所有jpg文件(如果要包含子目录的jpg,把glob改成rglob即可) for jpg_file in working_folder.glob('*.jpg'): # 只处理文件,跳过目录 if not jpg_file.is_file(): continue # 统计下划线数量 underline_count = jpg_file.name.count('_') # 超过1个下划线的移入错误文件夹 if underline_count > 1: shutil.move(str(jpg_file), str(error_folder / jpg_file.name)) continue # 符合要求的文件执行原有分类逻辑 # 生成分类目录名:替换空格,去掉.jpg后缀 dir_name = jpg_file.stem.replace(' ', '_') target_dir = working_folder / dir_name target_dir.mkdir(exist_ok=True) # 移动文件到分类目录 shutil.move(str(jpg_file), str(target_dir / jpg_file.name)) # 原有文件夹校验逻辑(需要保留的话可以继续使用) for dir_entry in working_folder.iterdir(): if dir_entry.is_dir() and dir_entry.name.count('_') != 1 and dir_entry != error_folder: shutil.move(str(dir_entry), str(error_folder / dir_entry.name))
额外优化建议
- 如果需要处理嵌套子目录里的jpg文件,把
working_folder.glob('*.jpg')改成working_folder.rglob('*.jpg')即可 - 可以增加重复文件判断,移动前先判断目标路径是否存在同名文件,避免覆盖
- 可以增加日志打印,记录每个文件的移动结果,方便后续排查问题
内容的提问来源于stack exchange,提问作者DEDev2021
相关产品推荐
相关产品推荐

