Python中`open`函数打开的文本文件有多少个缓冲区?

时间:2017-06-20 15:37:14

标签: python linux

这是在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

    < / LI>
  • f.buffer是字节缓冲区,其值由缓冲f.buffer open argument of f.buffer.raw`指定?

我最初的想法是,and it flushes its data处理某些任务,如编码,解码,然后将其数据提供给缓冲区,它实际上是缓冲区的包装器。它是type(f)字符串的缓冲区吗?

0 个答案:

没有答案