4

我正在尝试通过阅读文档来自学 Python。我试图了解刷新文件缓冲区的含义。根据文档,“file.flush”执行以下操作。

Flush the internal buffer, like stdio‘s fflush().
This may be a no-op on some file-like objects.

我不知道“内部缓冲区”和“无操作”是什么意思,但我认为它表示flush将数据从某个缓冲区写入文件。

因此,我运行这个文件来切换中间行的井号。

with open("myFile.txt", "w+") as file:
    file.write("foo")
    file.write("bar")
    # file.flush()
    file.write("baz")
    file.write("quux")

但是,myFile.txt无论是否调用file.flush(). 有什么作用file.flush()

4

2 回答 2

11

Python 缓冲写入文件。也就是说,file.write在数据实际写入硬盘驱动器之前返回。这样做的主要动机是少数大写比许多小写快得多,因此通过保存输出file.write直到积累一点,Python 可以保持良好的写入速度。

file.flush强制在那个时刻写出数据。当您知道可能需要一段时间才能写出更多数据,但您希望其他进程能够查看您已经写入的数据时,这是手。想象一个增长缓慢的日志文件。您不希望在建立足够的条目以使数据以一大块写出之前等待很长时间。

在任何一种情况下,file.close都会导致剩余数据被刷新,因此代码中的“quux”将被写出file(这是一个非常糟糕的名字,因为它会隐藏内置file构造函数)超出with上下文管理器的范围并获取关闭。

注意:您的操作系统会自己进行一些缓冲,但我相信每个实现 Python 的操作系统都会尊重file.flush将数据写入驱动器的请求。如果我错了,请有人纠正我。

顺便说一句,“no-op”的意思是“没有操作”,因为它实际上不会做任何事情。例如,StringIO 对象操作内存中的字符串,而不是硬盘驱动器上的文件。StringIO.flush可能只是立即返回,因为它真的没有什么可做的。

于 2012-05-11T03:57:02.473 回答
3

缓冲区内容可能会被缓存以提高性能。刷新确保内容完全写入磁盘,避免数据丢失。例如,当您希望在进行下一个文件操作之前将要求用户输入的行完全打印在屏幕上时,它也很有用。

于 2012-05-11T03:52:20.753 回答