Что единообразно заменяет StringIO Python2 в Python3? - PullRequest
0 голосов
/ 14 января 2020

Документация предполагает, что BytesIO - это новый StringIO, поскольку он поддерживает поиск по току .

Однако, это неверно .

BytesIO нельзя использовать единообразно с TextIOWrappers, поскольку они возвращаются вызовами open(). Первый возвращает байтов , последний возвращает текст объектов при чтении.

TextIOWrapper(BytesIO(...)) также не работает должным образом, потому что, опять же, он не поддерживает относительные поиски.

Так что является лучшей конструкцией для замены python2 StringIO в python3

1 Ответ

1 голос
/ 14 января 2020

Не существует единой равномерной замены, поскольку сама обработка строк изменилась в Python 3.

Класс для текстовых файлов в памяти в Python 3 - io.StringIO. Как и другие текстовые файлы, он не поддерживает текущие относительные поиски. В то время как io.StringIO теоретически может поддерживать эффективные текущие относительные поиски, для согласованности с другими текстовыми файлами (и во избежание ограничения реализации), он отказывается это делать.

Класс для двоичных файлов в памяти в Python 3 - это io.BytesIO. Есть большая вероятность, что это то, что вы должны использовать (и если это так, то вам, вероятно, следует открывать файлы на диске также в двоичном режиме).

Если вам действительно нужна гибкость Python 2 StringIO.StringIO.seek При работе с текстовым файлом в памяти в Python 3 лучше всего написать собственный класс.

...