我看到他们使用 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/