处理文本 I/O 时似乎忽略了 open() 的缓冲参数

使用文本 I/O 时,似乎忽略了内置 open() 函数的缓冲参数:


文本输入/输出:


>>> f = open("myfile_text.txt", "w",buffering=2)

>>> f.write('1')

1

>>> f.write('1')

1

>>> f.write('1')

1


mymachine:~ myuser$ cat myfile.txt ; echo

mymachine:~ myuser$

二进制输入/输出:


>>> f = open("myfile_binary.txt", "wb",buffering=2)

>>> f.write('1'.encode())

1

>>> f.write('1'.encode())

1

>>> f.write('1'.encode())

1


mymachine:~ myuser$ cat myfile.txt ; echo

11

mymachine:~ myuser$

为什么?这是预期的行为吗?


人到中年有点甜
浏览 162回答 1
1回答

慕容森

我摸索了一下。事实上,文档指出:buffering是一个可选整数,用于设置缓冲策略。传递 0 以关闭缓冲(仅在二进制模式下允许),1 以选择行缓冲(仅可用于文本模式),以及一个大于 1 的整数以指示固定大小块缓冲区的大小(以字节为单位)...因此,期望指定buffering=2会导致2B使用大小的缓冲区是合理的(并在使用该缓冲区时看到文件被刷新)。然而,在文本模式下,它似乎(和文档并没有真正清楚地表明,在这个地方)影响的下划线BufferedWriter,但TextIOWrapper它的write()你最终调用确实还“自己的事” ......与Python 3.7开始,你告诉它不要并让它通过调用f.reconfigure(write_through=True)您打开的文件立即将写入传递给底层对象。实际上,所有代码和检查值write_through都已经在 Python 3.6 中(我已经检查过 3.6.8)(事实上_io_TextIOWrapper_write_impl,即_io.TextIOWrapper.write,在两个版本中都是相同的),但该write_through属性尚未公开(尚未公开)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python