Python 在处理文本I/O时,open()的缓冲参数似乎被忽略
处理文本I/O时,内置open()函数的缓冲参数似乎被忽略: 文本I/O: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
>>> 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。