这是在Linux上测试的:
将buffering
参数传递给open并不会真正改变缓冲区大小:
buffering是一个可选的整数,用于设置缓冲策略。传递0以切换缓冲关闭(仅允许在二进制模式下),1选择行缓冲(仅在文本模式下可用),以及整数> 1表示固定大小的块缓冲区的大小(字节)。
以下是我尝试过的文本文件:
>>> f = open("/home/user/Desktop/data.txt", "w+", buffering=30)
f
返回的open
对象的解剖结构:
>>> f
<_io.TextIOWrapper name='/home/user/Desktop/data.txt' mode='w+' encoding='UTF-8'>
>>> f.buffer
<_io.BufferedRandom name='/home/user/Desktop/data.txt'>
>>> f.buffer.raw
<_io.FileIO name='/home/user/Desktop/data.txt' mode='rb+' closefd=True>
_io.TextIOWrapper
- &gt;处理编码,解码,通用EOF
翻译......
_io.BufferedRandom
- &gt;读写缓冲区。
io.FileIO
- &gt;这是磁盘上的文件。
如果我写入f.buffer.raw
,一切都直接转到磁盘上的文件,这会绕过f.buffer
并且操作系统将所有内容直接刷新到磁盘文件中,不需要调用{{1}使用文件描述符将数据从Os的缓冲区刷新到磁盘。
奇怪的是:
os.fsync
我的写入量远远超过指定为30个字节的缓冲区大小的两倍。我希望刷新缓冲区,并且我假设Python刷新了缓冲区,但是Os的缓冲区仍然保存数据,因此我调用>>> f.write("xyz" * 80)
240
但没有刷新任何内容,文件仍为空!
缓冲区没有被刷新,没有任何内容被写入磁盘,但写入缓冲区本身,其中写入数据量超过缓冲区大小,所有内容都被刷新,数据被写入磁盘上的文件:
os.fsync
这很奇怪,因为>>> f.buffer.write(b"x" * 30)
30
>>> f.buffer.write(b"x") # now buffer empties itself
1
应该编码并添加一些铃声和口哨声,然后一旦完成就会发送字节到type(f)
,当f.buffer
超过30时,指定为f.buffer
,缓冲区应该通过刷新自行清空。看起来似乎不是这样,当写入的数据超过open
时,问题是f
依赖于f._CHUNK_SIZE
。所有内容都写入磁盘。
然后_CHUNK_SIZE
充当f
个字符串的缓冲区,其中str
设置为其大小,并将其数据刷新为_CHUNK_SIZE
?
f.buffer
是字节缓冲区,其值由缓冲f.buffer
open argument of
f.buffer.raw`指定?
我最初的想法是,and it flushes its data
处理某些任务,如编码,解码,然后将其数据提供给缓冲区,它实际上是缓冲区的包装器。它是type(f)
字符串的缓冲区吗?