【问题标题】:BytesIO -> BufferedIOBase -> TextIOWrapper not possible to readlinesBytesIO -> BufferedIOBase -> TextIOWrapper 无法读取行
【发布时间】:2019-02-18 16:38:14
【问题描述】:

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

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

这会导致错误:

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

Python 版本 3.6.5

【问题讨论】:

    标签: python python-3.x io


    【解决方案1】:

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

    来自io.BufferedIOBase documentation

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

    您只需要使用BytesIO,它继承BufferedIOBase,它本身已经实现了作为缓冲I/O对象所需的方法。来自io.BytesIO documenation

    它继承BufferedIOBase。 [...]

    [...]

    BytesIO 提供或覆盖除了来自BufferedIOBaseIOBase 的方法之外的这些方法:[...]

    在此处将您的 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
    

    TextIOWrapper 文档告诉您第一个参数应该是BufferedIOBase 二进制流,目标是告诉您需要BufferedIOBase 的子类,实现 那个界面。 BytesIO 就是这样一个对象,io.BufferedIOReader()io.BufferedIOWriter()io.BufferedRandom()io.BufferedRWPair() 也是如此。

    一般来说,您不会创建文档中任何ABCs listed in the Class Hierarchy section 的实例。它们在那里提供文档,在您需要检查类型时进行测试,并成为派生自定义实现的坚实基础。

    【讨论】:

      猜你喜欢
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多