如何使用Python将文件夹复制到已存在的目标文件夹中
实现方案
你需要的场景用Python标准库就能直接实现,不需要额外安装第三方依赖,完全适配Python3.8.9和Windows平台。
核心思路
很多网上的复制教程没说清路径逻辑:不要直接把已存在的bar文件夹作为复制目标,而是把目标路径明确指定为bar下的foo子文件夹,配合shutil.copytree的递归复制能力,就能在不改动bar原有内容的前提下,把整个foo(包含所有子文件、子文件夹)复制到指定位置,最终得到bar/foo/*的结构。
可直接运行的代码
import shutil import os # 替换为你实际的路径,字符串前加r是为了避免Windows路径反斜杠的转义问题 src_foo_path = r"C:\actual\path\to\foo" # 待复制的foo文件夹路径 bar_parent_path = r"C:\actual\path\to\bar" # 已存在的bar文件夹路径 target_foo_path = os.path.join(bar_parent_path, "foo") # 拼接得到bar下的foo目标路径 # 执行递归复制 shutil.copytree( src=src_foo_path, dst=target_foo_path, dirs_exist_ok=True, # Python3.8新增参数,目标路径已存在时不会报错,会自动合并内容 symlinks=False # 不需要复制符号链接/快捷方式就保持默认,需要复制改为True即可 )
如果你更习惯面向对象的路径写法,也可以用Python3.4+自带的pathlib实现,效果完全一致:
import shutil from pathlib import Path src_foo_path = Path(r"C:\actual\path\to\foo") bar_parent_path = Path(r"C:\actual\path\to\bar") target_foo_path = bar_parent_path / "foo" shutil.copytree(src=src_foo_path, dst=target_foo_path, dirs_exist_ok=True)
注意事项
- 绝对不要直接调用
shutil.copytree(src_foo_path, bar_parent_path):这种写法会尝试把foo内的内容直接复制到bar根目录,且bar已存在时会直接抛出错误,完全不符合需求 - 不需要手动提前创建
bar/foo文件夹:shutil.copytree会自动创建路径中不存在的目录,即使提前创建了foo文件夹,开了dirs_exist_ok=True也不会报错 - 如果需要保留文件的创建时间、权限等元信息,不需要额外调整参数,
shutil.copytree默认使用copy2作为复制函数,已经会保留这些元信息 - Windows平台下路径也可以直接用正斜杠书写,比如
"C:/actual/path/to/bar",不需要加r前缀也能正常识别,避免转义问题
可选第三方方案
如果后续有更复杂的文件系统操作需求,可以使用pyfilesystem2库,但当前场景标准库shutil已经完全覆盖,不需要额外引入依赖。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

