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

2024-04-20 14:28:00 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑覆盖一个巨大的数据文件的以下程序。

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永远不会丢失,因为python是os.replaceassures 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)

这不会导致硬链路问题,但终止信号将被忽略很长一段时间

我想我必须用第二种方法,但我不确定。哪个更好?或者你还有别的好主意吗


Tags: inforsignaldictionaryosaswithline