我正在使用Python通过一次操作将大块文本写入文件:
open(file, 'w').write(text)
如果脚本被中断,所以文件写入未完成,我希望没有文件,而不是部分完成的文件。能做到吗?
将数据写入临时文件,并且在成功写入数据后,将文件重命名为正确的目标文件,例如
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 如果在电源故障,系统崩溃等情况下,性能/响应能力比数据完整性更重要,则可以跳过该步骤
os.fsync