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

VKK*_*VKK 5 python

假设我编写以下python代码:

file = open("test.txt","w+")
file.write("hi")
file.seek(0)
file.read()
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

如果这不是保证行为,我仍然可以依赖于在file.write之后调用file.seek或file.read(即/是否有一些其他内部机制来处理不涉及操作系统写入的内容)?或者最好的做法是file.flush()在写作之后总是在寻找或阅读之前打电话?

小智 1

特别是对于 CPython,对于缓冲 IOseek调用,_io__Buffered_seek_impl当且仅当 whence 参数设置为SEEK_END( 2)时,才保证刷新

read零参数调用_bufferedreader_read_allthrough _io__Buffered_read_impl,它会刷新。