为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

人到中年有点甜 2021-10-12 17:47:01
使用文本 I/O 时,似乎忽略了内置 open() 函数的缓冲参数:文本输入/输出:>>> f = open("myfile_text.txt", "w",buffering=2)>>> f.write('1')1>>> f.write('1')1>>> f.write('1')1mymachine:~ myuser$ cat myfile.txt ; echomymachine:~ myuser$二进制输入/输出:>>> f = open("myfile_binary.txt", "wb",buffering=2)>>> f.write('1'.encode())1>>> f.write('1'.encode())1>>> f.write('1'.encode())1mymachine:~ myuser$ cat myfile.txt ; echo11mymachine:~ myuser$为什么?这是预期的行为吗?
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

我摸索了一下。事实上,文档指出:

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属性尚未公开(尚未公开)。


查看完整回答
反对 回复 2021-10-12
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号