这是在Linux上测试的:
将buffering
参数传递给open实际上不会改变缓冲区大小:
buffering is an optional integer used to set the buffering policy. Pass 0 to switch buffering off (only allowed in binary mode), 1 to select line buffering (only usable in text mode), and an integer > 1 to indicate the size in bytes of a fixed-size chunk buffer.
以下是我为文本文件所做的尝试:
>>> f = open("/home/user/Desktop/data.txt", "w+", buffering=30)
由open
返回的f
对象的解剖:
>>> 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
-->;处理编码,解码,通用EOF
翻译
_io.BufferedRandom
-->;读写缓冲区
io.FileIO
-->;这是磁盘上的文件
如果我写入f.buffer.raw
所有内容都直接到磁盘上的文件,这将绕过f.buffer
,操作系统将所有内容直接刷新到磁盘文件中,则无需使用文件描述符调用os.fsync
将数据从操作系统的缓冲区刷新到磁盘
奇怪的事情:
>>> f.write("xyz" * 80)
240
我编写的缓冲区的大小是指定为30字节的缓冲区的两倍多。我希望缓冲区被刷新,我假设Python刷新了缓冲区,但是Os的缓冲区仍然保存着数据,所以我调用了os.fsync
,但是没有刷新任何内容,文件仍然是空的
不刷新缓冲区,也不向磁盘写入任何内容,但写入缓冲区本身时,写入的数据量超过缓冲区大小,所有内容都会被刷新,数据会写入磁盘上的文件:
>>> f.buffer.write(b"x" * 30)
30
>>> f.buffer.write(b"x") # now buffer empties itself
1
这很奇怪,因为type(f)
应该只编码并添加一些铃铛和哨子,然后一旦完成就向f.buffer
发送字节,当f.buffer
超过指定给open
的30时,缓冲区应该通过刷新来清空自己。似乎不是这样,问题是f
依赖于它的f._CHUNK_SIZE
当写入的数据超过_CHUNK_SIZE
时,所有的数据都被写入磁盘
然后f
充当str
字符串的缓冲区,设置_CHUNK_SIZE
是它的大小,它将数据刷新到f.buffer
f.buffer
是字节缓冲区,其值由缓冲区argument of
openand it flushes its data
f.buffer.raw`?指定
我最初的想法是,type(f)
处理某些任务,如编码、解码,然后将其数据提供给缓冲区,它实际上是缓冲区的包装器。它是str
字符串的缓冲区吗
目前没有回答
相关问题 更多 >
编程相关推荐