Python中for循环调用shutil.copytree出现全量文件重复复制问题如何解决
问题根因
- 初始代码错误调用了
shutil.copytree接口:该接口的功能是递归复制整个源目录下的所有内容到目标路径,你在遍历每个文件的循环内触发copytree,相当于每匹配到一个符合前缀要求的文件,就把整个源目录的全部文件重新复制一遍,自然会出现全量复制、耗时极长的问题。 - 后续修改为
shutil.copy2的代码方向正确,但存在两个缺陷:一是没有提前创建对应前缀的目标目录,直接复制会触发路径不存在的报错;二是os.path.join末尾手动拼接斜杠属于冗余写法,部分操作系统下可能引发路径识别错误。
正确实现方式
实现逻辑如下:先统一创建输出根目录,遍历文件时先提取文件名前缀,判断前缀所属的数据集分类后,先创建对应前缀的子目录,再复制单个文件到对应路径,避免全量复制和路径不存在的问题。
正确代码示例:
import os import shutil # 源目录配置 src_path = os.path.expanduser('/content/images/FemaleImages') # 输出目录配置,可根据实际情况调整 output_config = [ (nameTrainF, '/content/OutTrainF/'), (nameValF, '/content/OutValF/'), (nameTestF, '/content/OutTestF/') ] # 先确保所有输出根目录存在 for _, root_dir in output_config: os.makedirs(root_dir, exist_ok=True) # 遍历所有源文件 for file_name in os.listdir(src_path): # 跳过目录,只处理文件 src_file = os.path.join(src_path, file_name) if not os.path.isfile(src_file): continue # 提取文件名前缀 prefix = file_name[:10] # 判断所属数据集,执行复制 for name_set, root_dir in output_config: if prefix in name_set: # 构建前缀对应的目标目录,不存在则创建 target_dir = os.path.join(root_dir, prefix) os.makedirs(target_dir, exist_ok=True) # 复制单个文件到目标目录 shutil.copy2(src_file, target_dir)
内容的提问来源于stack exchange,提问作者lingyau lee
相关产品推荐
相关产品推荐

