BytesIO -> BufferedIOBase -> TextIOWrapper 无法读取行

Joo*_*zty 0 python io python-3.x

我正在尝试从像对象这样的字节中读取行。

这是一个非常简单的例子。我知道它可以以不同的方式完成,但保持这种流动很重要(BytesIO -> BufferedIOBase -> TextIOWrapper)。

import io
bytes_io = io.BytesIO(b"a\nb\nc")
buffered_io_base = io.BufferedIOBase(bytes_io)
text_io = io.TextIOWrapper(buffered_io_base)
for line in text_io:
    print(line)
Run Code Online (Sandbox Code Playgroud)

这最终会出现错误:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
io.UnsupportedOperation: not readable
Run Code Online (Sandbox Code Playgroud)

Python 版本 3.6.5

Mar*_*ers 6

io.BufferedIOBase 不应该被实例化,它甚至不应该有一个公共构造函数。您在这里当然不需要它,它是那里的一个基类,用于记录缓冲 I/O 对象必须实现的方法,以及继承类可以构建的默认实现。

io.BufferedIOBase文档

支持某种缓冲的二进制流的基类。它继承了IOBase. 没有公共构造函数。

您只需要使用BytesIO,它继承BufferedIOBase,它本身已经实现了成为缓冲 I/O 对象所需的方法。从io.BytesIO文档中

它继承了BufferedIOBase. [...]

[...]

BytesIO除了来自BufferedIOBase和的方法之外,还提供或覆盖这些方法IOBase:[...]

将您的BytesIO对象直接包装在TextIOWrapper()此处的对象中:

>>> import io
>>> bytes_io = io.BytesIO(b"a\nb\nc")
>>> text_io = io.TextIOWrapper(bytes_io)
>>> for line in text_io:
...     print(line, end='')
...
a
b
c
Run Code Online (Sandbox Code Playgroud)

TextIOWrapper文档告诉你的第一个参数预期为一个BufferedIOBase二进制流,我们的目标是要告诉你,你需要的子类BufferedIOBase,一些农具该接口。BytesIO是这样的对象,所以是io.BufferedIOReader()io.BufferedIOWriter()io.BufferedRandom(),和io.BufferedRWPair()

通常,您不会创建文档类层次结构部分列出的任何ABC 的实例。它们在那里提供文档,在您需要检查类型时进行测试,并成为派生自定义实现的坚实基础。