open() 的缓冲参数在处理文本时似乎被忽略 I/O
buffering argument of open() seemingly ignored when working with text I/O
在处理文本时似乎忽略了内置 open() 函数的缓冲参数 I/O:
正文I/O:
>>> 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$
二进制I/O:
>>> 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$
为什么?这是有意为之的行为吗?
我已经查了一下。事实上,文档指出:
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...
因此,可以合理预期指定 buffering=2
会导致使用大小为 2B
的缓冲区(并在使用该缓冲区时查看刷新的文件)。然而,在文本模式下,它似乎(并且文档并没有真正清楚地表明在这个地方)影响下划线 BufferedWriter
,但是 TextIOWrapper
你最终调用的 write()
仍然存在"its own thing"... 从 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
属性还没有公开。
在处理文本时似乎忽略了内置 open() 函数的缓冲参数 I/O:
正文I/O:
>>> 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$
二进制I/O:
>>> 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$
为什么?这是有意为之的行为吗?
我已经查了一下。事实上,文档指出:
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...
因此,可以合理预期指定 buffering=2
会导致使用大小为 2B
的缓冲区(并在使用该缓冲区时查看刷新的文件)。然而,在文本模式下,它似乎(并且文档并没有真正清楚地表明在这个地方)影响下划线 BufferedWriter
,但是 TextIOWrapper
你最终调用的 write()
仍然存在"its own thing"... 从 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
属性还没有公开。