我在他们使用file.flush()的地方看到了一个代码。因此,我四处搜寻并发现了This SO post。我有点理解为什么有冲洗方法。在标记为答案的答案中,写了以下内容
通常不需要打扰任何一种方法,但是如果您处于对实际存储在磁盘上的偏执狂的场景中,则应该按照指示进行两次调用。
所以,我想知道,当我们使用上下文管理器打开文件并编写一些文本,然后当代码从该上下文管理器退出时,是否有可能未将文本写入文件?如果是,为什么不在调用file.close()时在python内部进行此操作?已经完成了吗?
答案 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
方法且没有在关闭时调用它的对象。