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

Python 覆盖文件的最佳方式是什么?,python,filesystems,Python,Filesystems,考虑以下覆盖一个巨大数据文件的程序 with open('datafile', 'w') as f: for i in range(100000): line = 'x' * 1000 + '\n' f.write(line) 如果在写入时键入Control-C,则先前的数据文件竞争将丢失,并且只会写入新内容的一部分。我找到了两种解决方案来避免数据丢失。首先是使用os.replace 这样,数据文件就不会丢失,因为python支持os.replace。但

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

with open('datafile', 'w') as f:
    for i in range(100000):
        line = 'x' * 1000 + '\n'
        f.write(line)
如果在写入时键入Control-C,则先前的数据文件竞争将丢失,并且只会写入新内容的一部分。我找到了两种解决方案来避免数据丢失。首先是使用os.replace

这样,数据文件就不会丢失,因为python支持os.replace。但是,如果数据文件有硬链接,它将保留旧内容

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

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)
这不会导致硬链路问题,但终止信号将被忽略很长一段时间


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

因此,您正在写入临时文件,并且只有在写入成功时才使用临时文件替换旧文件,但数据文件不会被覆盖吗?或者你在实际文件中添加了一个链接?我真的不在乎硬链接。请注意,即使捕获编程信号也不是绝对正确的。例如,用户仍然可以硬终止进程。
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)