一尘不染

如何使文件创建成为原子操作?

python

我正在使用Python通过一次操作将大块文本写入文件:

open(file, 'w').write(text)

如果脚本被中断,所以文件写入未完成,我希望没有文件,而不是部分完成的文件。能做到吗?


阅读 333

收藏
2021-01-20

共1个答案

一尘不染

将数据写入临时文件,并且在成功写入数据后,将文件重命名为正确的目标文件,例如

f = open(tmpFile, 'w')
f.write(text)
# make sure that all data is on disk
# see http://stackoverflow.com/questions/7433057/is-rename-without-fsync-safe
f.flush()
os.fsync(f.fileno()) 
f.close()

os.rename(tmpFile, myFile)

根据文档http://docs.python.org/library/os.html#os.rename

如果成功,重命名将是原子操作(这是POSIX要求)。在Windows上,如果dst已经存在,即使它是一个文件,也会引发OSError;当dst命名现有文件时,可能无法实现原子重命名

如果src和dst在不同的文件系统上,则该操作在某些Unix风格上可能会失败。

注意:

  • 如果src和dest位置不在同一文件系统上,则可能不是原子操作

  • os.fsync 如果在电源故障,系统崩溃等情况下,性能/响应能力比数据完整性更重要,则可以跳过该步骤

2021-01-20