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

is it necessary to call flush method of file handler in python

我看到他们使用 file.flush() 的代码。所以,我四处搜索并找到 This SO post。我有点理解为什么有 flush 方法。在标记为答案的答案中写了以下内容

Typically you don't need to bother with either method, but if you're in a scenario where paranoia about what actually ends up on disk is a good thing, you should make both calls as instructed.

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

Python 在文件 .close()d 时刷新文件,这在退出上下文管理器时发生。

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

的地方

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

如果第三方库希望其对象成为文件对象,甚至第三方库也需要在其 close 方法上 "close and flush the stream"。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 或在记事本或其他任何工具中打开它时,它是空的,或者缺少最后 3 行,或者在一行的中间被截断。这就是 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 方法但未在关闭时调用它的对象。