我有一个在循环开始之前打开的文件,我几乎在循环的每次迭代中都写入该文件。然后我在循环结束后关闭文件。所以例如类似的东西:
testfile = open('datagathered','w')
for i in range(n):
...
testfile.write(line)
testfile.close()
我遇到的问题是,如果程序崩溃或我想让它崩溃,那么已经写入testfile
的内容将被删除,文本文件{{ 1}}将为空。我知道这是因为我只是在循环之后才关闭文件,但如果我在每次写入后关闭并打开文件(即在循环中)并不会导致令人难以置信的减速?
如果是的话,我有什么其他选择来写作,并确保在发生崩溃的情况下,已经写好的行不会以有效的方式迷失?
链接的帖子确实提出了可以回答这个问题的好建议,但它们并没有涵盖所涉及的风险和效率差异。更确切地说:使用缓冲区是否有任何风险?例如datagathered
如果要写入多个文件,最后使用testfile = open('datagathered','w',0)
仍然是一个可行的替代方法吗?
小注释:这是在长时间运行的情况下询问的,其中文件被写入2-3天。因此,拥有快速安全的写作方式绝对有价值。
答案 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)