在写入后调用查找和/或读取操作时,Python是否会自动刷新其缓冲区?

时间:2017-01-12 18:36:27

标签: python

假设我编写以下python代码:

file = open("test.txt","w+")
file.write("hi")
file.seek(0)
file.read()

第二行告诉Python我想写“hi”到文件。当然这里涉及两个缓冲区 - 内部Python缓冲区和操作系统缓冲区 - 所以“hi”实际上可能不会写入文件。我理解,如果我用file.flush()显式刷新文件或用file.close()关闭文件,那么Python缓冲区将被清除,Python将使用操作系统API写入方法。我也理解,在这两种情况下(我明确地称为flush或close),不能保证操作系统实际上会写入磁盘(为了保证这一点,我必须调用os.fsync(file))。

无论如何,在上面的代码中,我不会调用flush也不会关闭。所以这是我的问题:

在写操作之后,当我将文件指针返回到文件的开头(file.seek(0))和/或从文件(file.read())读取时,是否保证Python将刷新其自己的缓冲?如果这是有保证的,保证刷新是否是搜索操作,读操作或者其中之一?换句话说,搜索和/或读取是否自动执行刷新?而且要明确一点,我不是在谈论操作系统刷新到磁盘,我不能保证这是非常积极的 - 我只是在讨论Python刷新自己的缓冲区。

当我测试这个时,似乎读取和搜索都刷新了Python的缓冲区,但我不确定这是否只是可能的行为或保证行为。

如果这不是保证行为,我仍然可以依赖于在file.write之后调用file.seek或file.read(即/ Python有一些其他内部机制来处理这个不涉及OS写入的内容) ?或者,最好的做法是在写入后的搜索或阅读之前始终呼叫file.flush()

1 个答案:

答案 0 :(得分:0)

对于特定的CPython,对于缓冲的IO seek调用_io__Buffered_seek_impl,只要且仅当whence参数设置为SEEK_END2)时,才能保证刷新{ / p>

read(参数为零)会调用_bufferedreader_read_all_io__Buffered_read_impl,这会刷新。