为啥文本 I/O 必须在 python 3 中缓冲?
Posted
技术标签:
【中文标题】为啥文本 I/O 必须在 python 3 中缓冲?【英文标题】:Why text I/O must be buffered in python 3?为什么文本 I/O 必须在 python 3 中缓冲? 【发布时间】:2015-01-19 23:22:24 【问题描述】:Python 2 支持无缓冲文本 I/O。
同样的方法在 python 3 中不起作用。为什么禁用无缓冲文本 I/O?
> import sys
> sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
builtins.ValueError: can't have unbuffered text I/O
二进制文件仍然可以正常工作:
> sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0) # works fine
【问题讨论】:
至少对于阅读来说,我怀疑它与文本是 unicode 有关,所以 byte != char。如果底层字节流是 utf-8 编码的,则单个 char 是可变数量的字节,因此在读取完整字符后必须有一个缓冲区来包含剩余字节。我认为新的 io 模块有一个亮点(上面的 sys.stdout 可能是一个 IO 类实例)。 【参考方案1】:对于文本文件,如果要逐行使用缓冲,请使用open(..., buffering=1)
来自 python 文档:
1 选择行缓冲(仅在文本模式下可用)
【讨论】:
【参考方案2】:这是一个开放的错误,问题 #17404(最后更新 2013-03-13):http://bugs.python.org/issue17404
【讨论】:
在 3.7.2 中,文本模式不支持缓冲:bugs.python.org/issue17404#msg332739以上是关于为啥文本 I/O 必须在 python 3 中缓冲?的主要内容,如果未能解决你的问题,请参考以下文章
JAVA-初步认识-I/O流(字符流-缓冲区-复制文本文件)
在windows系统中对套接字数据进行io时为啥不可以直接使用文件io相关函数?