是否有必要在python中调用文件处理程序的flush方法

时间:2018-07-12 07:55:45

标签: python file flush

我在他们使用file.flush()的地方看到了一个代码。因此,我四处搜寻并发现了This SO post。我有点理解为什么有冲洗方法。在标记为答案的答案中,写了以下内容

  

通常不需要打扰任何一种方法,但是如果您处于对实际存储在磁盘上的偏执狂的场景中,则应该按照指示进行两次调用。

所以,我想知道,当我们使用上下文管理器打开文件并编写一些文本,然后当代码从该上下文管理器退出时,是否有可能未将文本写入文件?如果是,为什么不在调用file.close()时在python内部进行此操作?已经完成了吗?

2 个答案:

答案 0 :(得分:2)

在文件.close()中,

Python 刷新文件,这在退出上下文管理器时发生。

链接的文章更多地涉及一种情况,例如,您有一个打开时间很长的日志文件,并且您想确保每次写入后所有内容都被写入磁盘。那就是您要.write(); .flush();的地方。

答案 1 :(得分:2)

io模块中的文件对象(您从open获得的文件对象)以及在stdlib中期望的其他任何地方,当它们flush时总是close,或依赖保证可以这样做的平台API。

如果第三方库希望其对象成为文件对象,则必须使用其close方法来“关闭和刷新流”。 1


调用flush的主要原因是尚未 关闭文件,但是其他程序可能希望查看其内容。


例如,许多人编写如下代码:

with open('dump.txt', 'w') as f:
    while True:
        buf = read_off_some_thingy()
        f.write(buf.decode())
        time.sleep(5)

…,然后他们想知道为什么cat dump.txt或在记事本中打开它时,它是空的,或者遗漏了最后三行,或者在行中间中断了。这就是flush解决的问题:

with open('dump.txt', 'w') as f:
    while True:
        buf = read_off_some_thingy()
        f.write(buf.decode())
        f.flush()
        time.sleep(5)

或者,他们正在运行相同的代码,但是问题是有人可能拔下了计算机的插头(或者,如今更可能是杀死您的容器),然后重新启动后,它们会损坏中线中断的文件,现在扫描输出的perl脚本将无法运行,并且没人愿意调试perl代码。不同的问题,相同的解决方案。


但是,如果您知道某个文件将在某个时候关闭的事实(例如,因为有一个with语句在此之前结束),并且您不需要完成该文件在此之前,您无需致电flush


您没有提到fsync,这是另外一个问题,而且比大多数人要复杂得多,因此我不会去讨论。但是您链接的问题已经涵盖了基础知识。


1。总是有可能您正在使用一些第三方库,其中包含一个类似文件的对象,其鸭子类型足够接近您需要的文件对象,但事实并非如此。而且这种类型的close可能不是flush。但老实说,我认为我从未见过具有flush方法且没有在关闭时调用它的对象。