如何用Python从含30万文件夹的目录复制指定多文件夹?
批量复制指定文件夹到目标路径的解决方案
原代码存在的问题
- 目标路径参数错误:
shutil.copytree的第二个参数需要是目标文件夹的完整路径,而非父目录。原代码直接传入桌面路径,会导致复制逻辑混乱,触发报错。 - 重复文件夹未处理:
dir_list包含重复的17145,重复复制会因目标文件夹已存在而失败。 - 大目录性能浪费:
os.listdir(base_path)在30万个文件夹的目录下会极慢,完全没必要遍历整个目录,直接检查指定文件夹是否存在即可。 - 路径写法易出错:网络路径用转义字符写法容易出错,改用原始字符串更直观。
修正后的代码
import shutil import os # 用原始字符串处理网络路径,避免转义问题 base_path = r'\\10.52.16.9\Buildings' # 对指定文件夹列表去重,避免重复操作 dir_list = list(set(['17145','17145','17169','17172','17174'])) # 目标父目录 dest_root = r'C:\Users\user\Desktop' for dir_name in dir_list: source_dir = os.path.join(base_path, dir_name) # 直接检查源文件夹是否存在,无需遍历整个大目录 if os.path.isdir(source_dir): # 构造目标文件夹的完整路径(在桌面下创建同名文件夹) dest_dir = os.path.join(dest_root, dir_name) try: # Python3.8+支持dirs_exist_ok参数,允许目标文件夹存在时合并/覆盖内容 shutil.copytree(source_dir, dest_dir, dirs_exist_ok=True) print(f"成功复制文件夹: {dir_name}") except Exception as e: print(f"复制文件夹 {dir_name} 失败: {str(e)}") else: print(f"源文件夹不存在: {source_dir}")
低版本Python兼容处理
如果你的Python版本低于3.8,没有dirs_exist_ok参数,可以替换复制逻辑为:
if os.path.exists(dest_dir): shutil.rmtree(dest_dir) # 删除已存在的目标文件夹(注意:此操作会彻底删除目标内容) shutil.copytree(source_dir, dest_dir)
关键注意事项
针对30万文件夹的大目录,绝对不要遍历整个目录列表,直接通过指定文件夹名拼接路径并检查存在性,能大幅提升运行效率。
内容的提问来源于stack exchange,提问作者lkmtrk
相关产品推荐
相关产品推荐

