gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:37:02 29 4
gpt4 key购买 nike

假设我编写了以下 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 或 close。所以这是我的问题:

写操作后,当我将文件指针返回到文件开头时 (file.seek(0)) 和/或从文件中读取 (file.read( )),是否保证 Python 会刷新自己的缓冲区?如果这是有保证的,那么保证刷新是查找操作、读取操作还是两者之一的结果?换句话说,seek 和/或 read 会自动执行刷新吗?需要明确的是,我不是在谈论操作系统刷新到磁盘,我非常肯定这并不能保证——我只是在谈论 Python 刷新它自己的缓冲区。

当我对此进行测试时,似乎读取和查找都刷新了 Python 的缓冲区,但我不确定这是否只是可能的行为,还是保证的行为。

如果这不是保证的行为,我是否仍然可以依靠在 file.write 之后调用 file.seek 或 file.read(即/Python 是否有一些其他内部机制来处理这个不涉及操作系统写入的问题) ?或者在写入之后的查找或读取之前总是调用 file.flush() 是最佳做法吗?

最佳答案

对于特定的 CPython,对于缓冲 IO seek 调用 _io__Buffered_seek_impl当且仅当 whence 参数设置为 SEEK_END (2)

时,保证刷新

read 零参数调用 _bufferedreader_read_all通过 _io__Buffered_read_impl,它会刷新。

关于python - 在写入后调用查找和/或读取操作时,Python 是否会自动刷新其缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41620533/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com