崩溃后写入文件而不丢失数据

时间:2016-04-19 11:25:12

标签: python

我有一个在循环开始之前打开的文件,我几乎在循环的每次迭代中都写入该文件。然后我在循环结束后关闭文件。所以例如类似的东西:

testfile = open('datagathered','w')
for i in range(n):
    ...
    testfile.write(line)

testfile.close()
  • 我遇到的问题是,如果程序崩溃或我想​​让它崩溃,那么已经写入testfile的内容将被删除,文本文件{{ 1}}将为空。我知道这是因为我只是在循环之后才关闭文件,但如果我在每次写入后关闭并打开文件(即在循环中)并不会导致令人难以置信的减速?

  • 如果是的话,我有什么其他选择来写作,并确保在发生崩溃的情况下,已经写好的行不会以有效的方式迷失?

  • 链接的帖子确实提出了可以回答这个问题的好建议,但它们并没有涵盖所涉及的风险和效率差异。更确切地说:使用缓冲区是否有任何风险?例如datagathered如果要写入多个文件,最后使用testfile = open('datagathered','w',0)仍然是一个可行的替代方法吗?

  • 小注释:这是在长时间运行的情况下询问的,其中文件被写入2-3天。因此,拥有快速安全的写作方式绝对有价值。

2 个答案:

答案 0 :(得分:4)

从我理解的问题中,您所说的可能是在运行时和SIGINT上发生异常。

您可以使用'try-except-finally'块来实现您的目标。它使您能够捕获异常和SIGINT信号。由于finally块将被执行,因此捕获异常或一切顺利,关闭文件是最佳选择。以下示例代码可以解决您的问题。

testfile = open('datagathered','w')
try:
     for i in range(n):
         ...
         testfile.write(line)
except KeyboardInterrupt:
    print "Interrupt from keyboard"
except:
    print "Other exception"
finally:
    testfile.close()

答案 1 :(得分:2)

使用上下文:

with open('datagathered','w') as f:
    f.write(data)