python - io.BufferedReader 是否真的支持 readline?
问题描述
根据文档 io.BufferedReader
继承io.IOBase
:io.IOBase
-> io.BufferedIOBase
-> io.BufferedReader
。因此,它应该实现readline
and readinto
,但似乎并非如此,因为我得到了AttributeError
. 一个最小的例子:
数据样本:
$ printf 'foo bar\nspam ham\n' | gzip -c > compressed_file.gz
测试代码:
import gzip
import io
with io.BufferedReader(gzip.open('compressed_file.gz', 'rt')) as buffer:
buffer.readline()
例外:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-2-215a0d9b4feb> in <module>()
3
4 with io.BufferedReader(gzip.open('compressed_file.gz', 'rt')) as buffer:
----> 5 buffer.readline()
AttributeError: '_io.TextIOWrapper' object has no attribute 'readinto'
我错过了什么吗?
更新
有趣的是,您可以手动io.TextIOWrapper
退出io.BufferedReader
包装字节流,并且该readline
方法将起作用。
import gzip
import io
with io.TextIOWrapper(io.BufferedReader(gzip.open('compressed_file.gz'))) as buffer:
buffer.readline()
似乎_io.TextIOWrapper
返回的实例io.BufferedReader
与io.TextIOWrapper
实例不同,尽管后者是直接从_io
.
解决方案
是的,您确实缺少一个关键细节:BufferedReader
环绕现有RawIOBase
对象:
io.BufferedReader 类(原始,buffer_size=DEFAULT_BUFFER_SIZE)
提供对可读、顺序
RawIOBase
对象的更高级别访问的缓冲区。
而且因为您已经以文本模式打开了 gzip 文件,所以它不是一个RawIOBase
实例:
>>> f = gzip.open('compressed_file.gz', 'rt')
>>> isinstance(f, io.RawIOBase)
False
换句话说,这是一个用户错误。
如果你包装一个BufferedReader
二进制文件,你会发现该readline
方法工作得很好:
>>> io.BufferedReader(io.BytesIO(b'foo\nbar')).readline()
b'foo\n'
推荐阅读
- excel - 用于 Excel 的 JavaScript API 中的 onSettingsChanged 事件的处理程序是否仍然中断?
- python - 在我的 Ubuntu 服务器上使用 cURL、wget 和 Python 时出现 SSL 错误
- python - 插入文档数组
- javascript - 返回数组javascript的最大值
- java - 使用 java 流比较两个字符串列表
- agda - 用不相关的术语来证明不相关的事情
- python - 在 Chrome Web 浏览器的 Selenium Python 代码中向 send_keys 发送 UTF-8 消息
- php - 我通过cdn使用了CKEditor,但我无法将数据发送到数据库
- swift - 按下 SwiftUI 时更新按钮 UI
- java - 在终端上使用 -classpath 不起作用