使用shutil.copytree复制文件夹遇目标已存在时触发FileExistsError报错
问题根因
原有代码的重复判断逻辑完全失效:
- 变量
save_path仅记录上一轮刚执行完复制的目标路径,并没有实际检查目标路径在磁盘上是否已经存在。 - 当重复的目标文件夹不是连续出现时(比如几轮循环之前就已经复制过
Y:\P43_NEW\2022-02-21\112_1,但上一轮复制的是其他路径),save_path和当前目标路径的比对结果为不相等,代码会直接执行shutil.copytree。而默认配置下shutil.copytree要求目标路径必须不存在,因此直接触发FileExistsError报错中断。
修复方案
根据你的实际需求二选一即可:
方案1:目标路径已存在时直接跳过
这是和你最初设计逻辑一致的方案,每次复制前直接检查磁盘上的目标路径是否存在,仅不存在时执行复制:
import os import shutil # 原有SourcePath、DstPath定义、DataFrame加载逻辑保持不变 for i, r in df.iterrows(): date = r["Date"] ID = r["ID"] survey_paths = findSurveys(path = SourcePath, survey_id = ID) for path in survey_paths: temp = path.split("\\") save_date = temp[-2] save_id = temp[-1] # 推荐用os.path.join拼接路径,避免手动写转义符出错 target_path = os.path.join(DstPath, save_date, save_id) if not os.path.exists(target_path): shutil.copytree(path, target_path) print(f"{save_id} ({save_date}) copied!") else: print(f"{save_id} ({save_date}) 已存在,跳过复制")
注:原代码中单独维护save_path变量的逻辑已经不需要,可以直接删除,因为我们每次都做真实的磁盘存在性检查,不会出现重复复制的问题。
方案2:目标路径已存在时合并覆盖内容
如果你需要保留已存在的目标文件夹,同时把源文件夹里的内容复制进去、同名文件直接覆盖,可以直接给shutil.copytree传入dirs_exist_ok=True参数(Python 3.8及以上版本支持),不需要额外写存在判断:
# 复制代码行修改为如下格式即可 shutil.copytree(path, target_path, dirs_exist_ok=True)
内容的提问来源于stack exchange,提问作者TRE
相关产品推荐
相关产品推荐

