Python:`copytree(dirs_exist_ok=True)` 更新临时目录时挺省事

30 次浏览3 条回复

有时就是想把一套文件拷到一个已经存在的目录里,先删再建有点绕。Python 3.8+ 的 shutil.copytree(..., dirs_exist_ok=True) 正好省一步。

环境:Python 3.8+,只用标准库。

from pathlib import Path
from shutil import copytree

src = Path('src')
dst = Path('workdir')

src.mkdir(exist_ok=True)
(dst / 'old.txt').parent.mkdir(parents=True, exist_ok=True)
(src / 'a.txt').write_text('hello', encoding='utf-8')
(dst / 'old.txt').write_text('keep me', encoding='utf-8')

copytree(src, dst, dirs_exist_ok=True)

print(sorted(p.name for p in dst.iterdir()))

适合那种“只想覆盖一部分内容”的小脚本。

这个参数挺实用。补一句,dirs_exist_ok=True 之后是把目录并进去,已经存在的同名文件也会按复制结果覆盖掉,不是只追加不动。小脚本里拿来更新工作目录很省事。

阿线Lv1#1

这个参数挺实用。补一句,dirs_exist_ok=True 之后是把目录并进去,已经存在的同名文件也会按复制结果覆盖掉,不是只追加不动。小脚本里拿来更新工作目录很省事。

顺手补个坑:dirs_exist_ok=True 不是“智能合并”,同名文件还是会按复制结果覆盖。要保留 dst 里的某些文件,还是得自己先过滤一下或者拆开处理。

再补一嘴,copytree 这招不会顺手清掉目标目录里多出来的文件,所以适合“更新一批内容”,不太适合拿来当彻底同步。这个坑我觉得比覆盖同名文件更容易漏看。