如何不指定中间父文件夹复制特定子文件夹?(Python)
如何不指定中间父文件夹复制目标子文件夹?
shutil.copytree不支持直接使用shell通配符(比如*)匹配路径,所以你写的shutil.copytree("document/*/id_012", "destination")会失效——Python会把*当作路径的一部分,而非通配符来解析。
下面提供两种可行的解决方案:
方法1:用glob模块匹配路径后复制
glob模块可以帮你解析通配符,找到所有符合document/*/id_012格式的目录,再逐个复制:
import glob import shutil import os # 匹配所有符合规则的目标路径 target_dirs = glob.glob("document/*/id_012") # 遍历路径并复制,保留原版本目录结构 for src_dir in target_dirs: version_name = os.path.basename(os.path.dirname(src_dir)) dst_dir = os.path.join("destination", version_name, "id_012") # dirs_exist_ok=True 允许目标目录已存在时覆盖/合并(Python 3.8+支持) shutil.copytree(src_dir, dst_dir, dirs_exist_ok=True)
如果需要把所有id_012里的内容合并到同一个destination目录下,可以改成遍历文件逐个复制:
import glob import shutil import os target_dirs = glob.glob("document/*/id_012") os.makedirs("destination", exist_ok=True) for src_dir in target_dirs: for item in os.listdir(src_dir): src_path = os.path.join(src_dir, item) dst_path = os.path.join("destination", item) if os.path.isdir(src_path): shutil.copytree(src_path, dst_path, dirs_exist_ok=True) else: shutil.copy2(src_path, dst_path)
方法2:用pathlib遍历目录(Python 3.4+)
pathlib提供了更直观的路径操作方式,直接遍历document下的子目录,检查是否存在id_012:
from pathlib import Path import shutil document_root = Path("document") destination_root = Path("destination") # 遍历document下的所有子目录 for version_dir in document_root.iterdir(): if version_dir.is_dir(): target_dir = version_dir / "id_012" if target_dir.exists() and target_dir.is_dir(): # 保留版本结构复制 dst_dir = destination_root / version_dir.name / "id_012" shutil.copytree(target_dir, dst_dir, dirs_exist_ok=True)
注意事项
- 若多个版本目录下都有
id_012,需提前确定是保留各自的版本结构,还是合并内容到同一目录,两种方案分别对应上述不同代码逻辑。 dirs_exist_ok=True是Python 3.8及以上版本的参数,若使用更低版本,需先判断目标目录是否存在,存在则手动处理(如删除旧目录或合并文件)。
内容的提问来源于stack exchange,提问作者ss.workspace
相关产品推荐
相关产品推荐

