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

标签 python file flush

我看到他们使用 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() 时不在内部执行此操作?已经完成了吗?

最佳答案

io 模块中的文件对象(您从 open 获得的文件对象)以及您期望在 stdlib 中的其他任何地方总是 flush 当它们关闭,或依赖保证关闭的平台 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 或在记事本或其他任何工具中打开它时,它是空的,或者缺少最后 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 方法且未在关闭时调用它的对象。

关于python - 是否有必要在 python 中调用文件处理程序的刷新方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51300181/

相关文章:

python - 如何从 Android 应用程序连接到 Odoo 数据库

python - Keras 值错误 : I/O operation on closed file

python - 将平面数据转换为 LIST DICT 树

java - 突出显示 JTextPane 中的第一行

linux - 如何显示/proc 中文件的大小?它不应该是零大小

Python:将 numpy 数组保存到 ROOT 文件

C++ 从二进制文件中读回 "incorrect"值?

c++ - fstream 不会打印到文件

PHP on the fly flush xml to zipfile and push download

Python:为什么这个打印会自动刷新到屏幕而不需要flush()?