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

使用shutil.copytree迁移文件夹内容失败,报NotADirectoryError错误

问题分析与解决

错误根源

你用os.listdir()遍历源目录时,会拿到目录里的所有条目——包括子目录和文件,但shutil.copytree()只能用来复制目录,当遍历到像Access_Storage_Rev7.bat这样的文件时,自然会抛出NotADirectoryError,因为它不是目录。

解决方案

不需要手动遍历目录内容,直接用shutil.copytree()复制整个源目录即可,它的ignore参数会自动帮你过滤掉指定类型的文件和目录。另外,路径拼接建议用os.path.join(),避免手动拼斜杠导致的路径错误。

修改后的代码:

import os
import shutil
from shutil import ignore_patterns

# 假设checkuser已定义,比如checkuser = "GAS02224"
OD_daily_files = os.path.join(
    "C:\\Users", checkuser, 
    "Gas South", "SRM Team - General", 
    "Risk Management", "Storage", 
    "EBB Downloads", "Daily_Files"
)
SD_daily_files = "S:\\Supply\\Risk Management\\Daily auto downloads\\Storage\\Daily_Files"

# 直接复制整个源目录,自动应用过滤规则
shutil.copytree(OD_daily_files, SD_daily_files, 
                ignore=ignore_patterns('File_Examples*', '*.lnk', '*.pptx', '*.accdb', '*.bat'))

额外注意

如果目标目录SD_daily_files已经存在,shutil.copytree()会报错。如果需要合并内容(而非覆盖),可以改用递归遍历的方式:

import os
import shutil
from shutil import ignore_patterns

def copy_dir_with_ignore(src, dst, ignore):
    # 创建目标目录(如果不存在)
    os.makedirs(dst, exist_ok=True)
    # 获取源目录下的所有条目,过滤掉ignore规则匹配的内容
    items = [item for item in os.listdir(src) if not ignore(src, [item])]
    
    for item in items:
        src_item = os.path.join(src, item)
        dst_item = os.path.join(dst, item)
        if os.path.isdir(src_item):
            # 递归复制子目录
            copy_dir_with_ignore(src_item, dst_item, ignore)
        else:
            # 复制文件
            shutil.copy2(src_item, dst_item)

# 初始化过滤规则
ignore = ignore_patterns('File_Examples*', '*.lnk', '*.pptx', '*.accdb', '*.bat')
# 调用自定义函数复制
copy_dir_with_ignore(OD_daily_files, SD_daily_files, ignore)

内容的提问来源于stack exchange,提问作者Cordell Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:35:32