使用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
相关产品推荐
相关产品推荐

