BytesIO -> BufferedIOBase -> TextIOWrapper невозможно читать строки - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь прочитать строки из байтов, как объект.

Вот очень простой пример.Я знаю, что это можно сделать по-другому, но важно сохранить этот поток (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

1 Ответ

0 голосов
/ 18 февраля 2019

io.BufferedIOBase не должен быть создан , у него даже не должно быть публичного конструктора.Вам, конечно, не нужно здесь, это базовый класс , чтобы документировать методы, которые должны реализовывать буферизованные объекты ввода / вывода, с реализациями по умолчанию, на которых могут основываться наследующие классы.

Из документации 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

Где документация TextIOWrapper говорит вам, что первый аргумент должен быть BufferedIOBase двоичный поток, цель - сообщить вам, что вам нужен подкласс BufferedIOBase, то, что реализует этого интерфейса.BytesIO является таким объектом, как и io.BufferedIOReader(), io.BufferedIOWriter(), io.BufferedRandom() и io.BufferedRWPair().

Как правило, вы не создадите экземпляры любого из ABC, перечисленных в Иерархия классов в разделе документации.Они предназначены для того, чтобы предоставить документацию, что-то, что нужно проверить, когда вам нужно проверить типы, и быть прочной основой для получения пользовательских реализаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...