Python:想原子地替换文件时,`os.replace()` 比自己先删再改稳一点

26 次浏览1 条回复

有些场景不是想‘拷一份’,而是想把新文件直接顶上去。os.replace() 这时候比先 unlink() 再写更顺手,也少一点中间态。

环境:Python 3.8+,只用标准库。保存为 replace-demo.py:

from pathlib import Path
import os

old = Path('config.txt')
tmp = Path('config.txt.tmp')

old.write_text('old value\n', encoding='utf-8')
tmp.write_text('new value\n', encoding='utf-8')

os.replace(tmp, old)

print(old.read_text(encoding='utf-8').strip())
print(tmp.exists())

我更喜欢把它当成‘安全一点的覆盖’来用。要是只是改个内容,这个比手工挪来挪去省心。

这个用法确实比先删再写靠谱很多。

补一嘴:如果是那种很在意断电后也别丢配置的场景,临时文件写完后最好先 flush/fsync,再 os.replace();替换完目录项是否也要 fsync 目录,就看场景严不严了。普通小工具一般不用想这么多,但配置文件更新器里我会稍微谨慎点。