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

2024-04-27 04:13:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到他们用的代码文件.flush(). 所以,我四处寻找,找到了This SO post。我有点明白为什么要用冲洗法。在被标为答案的答案中写着以下内容

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在文件.close()被调用?已经做了吗?在


Tags: 文件to答案代码文本you管理器so
2条回答

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

即使是第三方库也需要在其^{}方法上“关闭并刷新流”,如果它们希望它们的对象是文件对象。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解决的问题:

^{pr2}$

或者,它们运行的是相同的代码,但问题是有人可能拔掉计算机上的插头(或者,现在更可能的是,杀死你的容器),然后重新启动后,他们将有一个损坏的文件,在中间行被切断,现在扫描输出的perl脚本将无法运行,没有人想调试perl代码。不同的问题,相同的解决方案。在


但是,如果您知道文件将在某个时间点关闭(例如,因为有一个with语句在该点之前结束),并且不需要在该点之前完成该文件,则无需调用flush。在


你没有提到fsync,这是一个完全不同的问题,比大多数人的事情复杂得多,所以我就不谈了。但你提到的问题已经涵盖了基本问题。在


1。您总是有机会使用某个第三方库来处理一个类似文件的对象,该对象的类型与您需要的文件对象非常接近,但不是这样。这样的类型可能有一个close而不是{}。但老实说,我从来没有见过一个对象有一个flush方法,它在close时没有调用它。

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

链接的post更多的是指这样一个场景,比如说,一个日志文件打开了很长一段时间,并且您希望确保每次写入之后,所有内容都被写入磁盘。这就是你想要.write(); .flush();的地方。在

相关问题 更多 >