覆盖python文件的最佳方法是什么?

时间:2014-08-02 16:52:25

标签: python filesystems

考虑以下覆盖大量数据文件的程序。

with open('datafile', 'w') as f:
    for i in range(100000):
        line = 'x' * 1000 + '\n'
        f.write(line)

如果您在写作时键入Control-C,之前的datafile竞赛将会丢失,并且只会写入部分新内容。我找到了两种避免数据丢失的解决方案。第一种是使用os.replace

import os

with open('tmpfile', 'w') as f:
    for i in range(100000):
        line = 'x' * 1000 + '\n'
        f.write(line)

os.replace('tmpfile', 'datafile')

这样,datafile永远不会丢失,因为os.replace的python assures the atomicity。但是,如果存在datafile的硬链接,则会保留旧内容。

第二个是导致程序终止的陷阱信号。

import signal

# makes exit signals ignored and returns the previous handlers
def ignore_exit_signals():
    signals = [signal.SIGHUP, signal.SIGINT, signal.SIGQUIT, signal.SIGTERM]
    handler_dictionary = {}
    for sig in signals:
        handler_dictionary[sig] = signal.getsignal(sig)
        signal.signal(sig, signal.SIG_IGN)
    return handler_dictionary

def restore_exit_signal_handlers(handler_dictionary):
    for sig, handler in handler_dictionary.items():
        signal.signal(sig, handler)

handler_dictionary = ignore_exit_signals()
with open('datafile', 'w') as f:
    for i in range(100000):
        line = 'x' * 1000 + '\n'
        f.write(line)
restore_exit_signal_handlers(handler_dictionary)

这不会导致硬链接问题,但终止信号会被忽略很长时间。

我认为我必须使用第二种方式,但我不确定。哪个更好?或者你有另一个好主意吗?

0 个答案:

没有答案