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

标签 python

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

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

testfile.close()
  • 我遇到的问题是,如果程序崩溃或我想​​崩溃,已经写入testfile 的内容将被删除,文本文件datagathered 将为空。我知道发生这种情况是因为我只在循环后关闭文件,但是如果我在每次写入后(即在循环中)关闭并打开文件,这不会导致难以置信的减速吗?

  • 如果是,我有什么替代方案来进行写作,并确保在发生崩溃时,已经写好的行不会以有效的方式丢失?

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

  • 小提示:这是在非常长的运行环境下提出的,文件将被写入 2-3 天。因此,拥有一种快速、安全的写作方式在这里绝对有值(value)。

最佳答案

从问题中我了解到您在谈论异常可能发生在运行时和 SIGINT。

您可以使用“try-except-finally” block 来实现您的目标。它使您能够捕获异常和 SIGINT 信号。由于 finally block 将被执行,要么捕获到异常,要么一切顺利,关闭文件是最好的选择。我猜下面的示例代码可以解决您的问题。

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()

关于python - 崩溃后写入文件而不会丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36716982/

相关文章:

python - 找出在某些条件下返回空哈希的方法的返回值

python - 如何在反向传播算法中使用链式法则的结果中的矩阵相乘

python - 压平多文件 python 程序以进行分发的好方法?

python - 对 nvidia triton 使用字符串参数

python - 使用 ElementTree 输出 "unused"XML 命名空间

python - 从 celery 任务中获取 celery worker 的名字?

python - 为什么django使用逗号作为小数点分隔符

python - 处理 cPickle 不可用

python - 在 redis 中使用排序集的替代数据模型(对于 Django/Python 项目)

python - 使用 Python 将公式写入 Excel