Windows下Python批量复制名称含指定字符串的目录及内容
Windows下Python批量拷贝名称含指定字符串的文件夹
需求场景
- 运行环境:Windows系统,基于Python实现文件批量操作
- 功能目标:将所有名称包含
Baseline字符串的文件夹及其内部全部内容,从源磁盘目录拷贝到目标磁盘目录 - 源目录结构:
Data |patient01 ||001_Baseline_CT |||dicom1.dicom |||dicom2.dicom |||dicom3.dicom |||... ||001_Recurrence_CT |patient02 ||002_Baseline_CT |||dicom1.dicom |||dicom2.dicom |||dicom3.dicom |||...
- 期望输出的目标目录结构:
Output_directory |001_Baseline_CT ||dicom1.dicom ||dicom2.dicom ||dicom3.dicom ||... |002_Baseline_CT ||dicom1.dicom ||dicom2.dicom ||dicom3.dicom ||...
原有脚本的错误点
之前编写的脚本运行失败,核心问题如下:
- 缺少
fnmatch模块的导入语句,调用对应匹配方法时会直接抛出异常 - 对
os.walk()的返回结构理解错误:该方法遍历目录时返回的是(当前遍历根路径, 当前路径下的子文件夹列表, 当前路径下的文件列表)三元组,不是单个文件/文件夹路径,不能直接作为路径参数使用 - 拷贝方法选择错误:匹配到的是文件夹,应该使用目录级拷贝方法,而非单文件拷贝的
shutil.copy2 - 路径拼接逻辑错误,无法正确定位源文件和目标路径
- 目标目录创建逻辑冗余,不需要每次匹配到内容都判断目录是否存在,提前创建一次即可
修正后可直接运行的代码
import os import shutil # 替换为你自己的实际路径,Windows路径前加r避免反斜杠转义 source_root = r"E:\your_source_path\Data" target_root = r"F:\your_target_path\Output_directory" # 提前创建目标根目录,exist_ok=True表示目录已存在时不报错 os.makedirs(target_root, exist_ok=True) # 遍历源目录下所有层级 for current_path, dir_list, file_list in os.walk(source_root): # 逐个检查当前层级下的文件夹 for dir_name in dir_list: # 判断文件夹名是否包含目标字符串Baseline if "Baseline" in dir_name: source_dir = os.path.join(current_path, dir_name) target_dir = os.path.join(target_root, dir_name) # 如需覆盖目标路径下已存在的同名文件夹,可取消下面两行注释 # if os.path.exists(target_dir): # shutil.rmtree(target_dir) # 递归拷贝整个文件夹及内部所有内容 shutil.copytree(source_dir, target_dir) print(f"拷贝完成:{dir_name}")
使用说明
- Windows系统填写路径时,务必在路径字符串前加
r,比如r"C:\Users\XXX\Data",避免反斜杠被Python识别为转义字符导致路径错误 - 如果目标目录下已经存在同名的Baseline文件夹,直接运行会报错,可打开代码中注释的覆盖逻辑,自动删除旧文件夹后再拷贝
- 简单的字符串包含判断直接用Python内置的
in关键字即可,不需要额外调用fnmatch,逻辑更简洁运行效率更高
内容的提问来源于stack exchange,提问作者yakumo
相关产品推荐
相关产品推荐

