【问题标题】:How to not lose Intermediate Data in File如何不丢失文件中的中间数据
【发布时间】:2014-05-26 09:47:01
【问题描述】:

在学习 Python 时,我们会打印到屏幕,但最终会打印到输出文件...但是大多数时候代码中的所有错误都没有解决...在这种情况下,代码在运行大约 10 20 个循环后中止或说 80% 的代码然后中止。但是在此期间打印到文件的数据会丢失,因为 file.close() 没有执行。

在 Python 中有一种方法可以保存 WIP 文件。我想在不以附加模式多次关闭和重新打开文件的情况下执行此操作。这将有助于调试,并且不会丢失发生错误之前积累的数据。

搜索后我没有找到这样的东西......如果有人有或可以提供任何想法如何为此制作一个很棒的模块......我们需要的是一个通用的包罗万象......以防万一任何错误.. 执行包罗万象的代码以关闭文件,然后从 Python 退出。

【问题讨论】:

  • 向我们展示代码。一般来说,你会做with open(...) as f:,但如果不关闭文件就消失的可能性很小(仅仅是因为解释器在 GC 收集它们时会关闭所有打开的文件)。其他事情必须在后台发生。

标签: python file output autosave


【解决方案1】:

您可以通过在有问题的文件对象上调用 f.flush() 来刷新内部文件缓冲区。

更好的方法是将文件访问封装在with block 中。如果引发异常,则关闭文件。

with open('tmp.txt', 'r') as f:
    do_stuff_with(f)

【讨论】:

  • 抱歉,但是来自 C 背景,我更习惯于 f.open() 和最后 f.close()... 而不是 pythonic 使用 open.. 的方式将移动迟早要这样……
【解决方案2】:

关于文件对象的文档:https://docs.python.org/2/library/stdtypes.html?highlight=flush#file.flush

使用flush 函数。文档上还有一个带有os.fsync 功能的注释,以确保将数据写入光盘。

【讨论】:

  • 除了不时刷新之外,您还可以一起禁用缓存:f = open(.., buffering=0)。无论哪种情况,请注意性能损失!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2021-06-27
相关资源
最近更新 更多