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

Python 在处理文本I/O时,open()的缓冲参数似乎被忽略,python,python-3.x,io,buffer,Python,Python 3.x,Io,Buffer,处理文本I/O时,内置open()函数的缓冲参数似乎被忽略: 文本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$ >&g

处理文本I/O时,内置open()函数的缓冲参数似乎被忽略:

文本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$
>>> 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$
二进制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$
>>> 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$

为什么??这是有意为之的吗?

我已经在这个问题上做了一些探讨。事实上,文件指出:

缓冲是用于设置缓冲策略的可选整数。传递0以关闭缓冲(仅在二进制模式下允许),传递1以选择行缓冲(仅在文本模式下可用),传递大于1的整数以指示固定大小块缓冲区的字节大小

因此,可以合理地预期,指定
buffering=2
将导致使用大小为
2B
的缓冲区(请参阅使用该缓冲区时刷新的文件)。然而,在文本模式下,它似乎(文档在这里并没有明确指出)会影响下划线
BufferedWriter
,但是
TextIOWrapper
write()
仍然是“它自己的事情”。。。从Python3.7开始,您告诉它不要这样做,并让它通过调用已打开的文件立即将写操作传递给底层对象



实际上,
write\u-to
的所有代码和值检查都已经在Python3.6中了(我已经检查了3.6.8)(事实上,
\u-io\u-TextIOWrapper\u-write\u-impl
,即
\u-io.TextIOWrapper.write
,在两个版本中都是相同的),但是
write\u-to
属性还没有公开(尚未公开).

@AlexanderStrakhov该链接指向Python2.7,但该问题被标记为Python3。@JohnGordon它应该是什么意思?从文档中可以看出:“缓冲是用于设置缓冲策略的可选整数。传递0以关闭缓冲(仅在二进制模式下允许),传递1以选择行缓冲(仅在文本模式下可用),传递大于1的整数以指示固定大小区块缓冲区的字节大小。”@SimónRamírezAmaya早些时候的评论中提到的答案引用了2.7版本的文档,文档中说这是一个近似的大小。3.6文档不同,它没有说近似值;我看错了文件。我将删除我之前的评论。感谢您的研究。那么,我们必须显式声明TextIOWrapper将写操作传递给BufferedWriter这一事实是否意味着原始的open(…,buffering=2)参数不会影响TextIOWrapper缓冲区的大小?事实上,
\u io的缓冲区。TextIOWrapper
本身目前已经硬编码到8kB。