如何用Python将train/LUAD下所有子文件夹的jpg图片移动到train_new/LUAD
问题原因及修复方案
核心问题
- 重名文件覆盖:不同子文件夹下的jpg图片存在大量同名情况,直接将所有文件复制到同一个目标路径时,后复制的文件会直接覆盖先复制的同名文件,最终仅剩下最后一个被遍历到的子文件夹的图片。
- 功能接口使用错误:需求为移动图片,但代码中使用
shutil.copy仅执行复制操作,原路径文件不会被删除。 - 无文件类型过滤:代码会将子文件夹下所有类型的文件强制重命名为
.jpg格式存入目标路径,会生成大量无效文件。 - 无目标路径校验:如果目标文件夹
train_new/LUAD不存在,代码运行会直接报错。
修复后代码
import os import shutil def moveFiles(path, disdir): # 目标文件夹不存在则自动创建 if not os.path.exists(disdir): os.makedirs(disdir, exist_ok=True) dirlist = os.listdir(path) for file_name in dirlist: child_path = os.path.join(path, file_name) if os.path.isfile(child_path): # 仅处理jpg格式文件 suffix = os.path.splitext(file_name)[1].lower() if suffix != '.jpg': continue # 拼接上层子目录名到文件名,避免重名覆盖 parent_dir = os.path.basename(path) new_file_name = f"{parent_dir}_{file_name}" # 移动文件,需保留原文件可换回shutil.copy shutil.move(child_path, os.path.join(disdir, new_file_name)) continue moveFiles(child_path, disdir) if __name__ == '__main__': rootimage = '/content/drive/MyDrive/stat841_final_data/train/LUAD' disdir = '/content/drive/MyDrive/stat841_final_data/train_new/LUAD' moveFiles(rootimage, disdir)
修复说明
- 新增目标路径自动创建逻辑,规避路径不存在的报错
- 新增文件后缀校验,仅迁移jpg格式图片
- 将子文件夹名称拼接到新文件名前,彻底解决不同子文件夹下文件重名覆盖的问题
- 替换
shutil.copy为shutil.move符合移动文件的需求,若需保留原路径文件可自行换回shutil.copy
内容的提问来源于stack exchange,提问作者Hermi
相关产品推荐
相关产品推荐

