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

2024-06-02 04:41:13 发布

您现在位置:Python中文网/ 问答频道 /正文

这是在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 ofopenand it flushes its dataf.buffer.raw`?指定

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


Tags: 文件to数据io内容homedatamode