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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:48:17