You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:36:03