Замена StringIO, которая работает с байтами вместо строк? - программирование
Подтвердить что ты не робот

Замена StringIO, которая работает с байтами вместо строк?

Есть ли замена для класса python StringIO, который будет работать с bytes вместо строк?

Это может быть не очевидно, но если вы использовали StringIO для обработки двоичных данных, вам не повезло с Python 2.7 или новее.

4b9b3361

Ответ 1

Попробуйте io.BytesIO.

Как другие указали, вы действительно можете использовать StringIO в 2.7, но BytesIO является хорошим выбором для передовой совместимости.

Ответ 2

В Python 2.6/2.7 модуль io предназначен для совместимости с Python 3.X. Из документов:

Новое в версии 2.6.

Модуль io предоставляет Python интерфейсы для обработки потоков. Под Python 2.x, это предлагается как альтернатива встроенному файлу объект, но в Python 3.x это интерфейс по умолчанию для доступа к файлам и потоков.

Примечание. Поскольку этот модуль был разработанный в основном для Python 3.x, вы должны знать, что все виды использования "байты" в этом документе относятся к str type (из которых байты являются псевдонимом), и все виды использования "текста" относятся к Unicode. Кроме того, эти два типы не взаимозаменяемы в io API.

В версиях Python раньше 3.X модуль StringIO содержит устаревшую версию StringIO, которая в отличие от io.StringIO может использоваться в версиях Python до 2.6:

>>> import StringIO
>>> s=StringIO.StringIO()
>>> s.write('hello')
>>> s.getvalue()
'hello'
>>> import io
>>> s=io.StringIO()
>>> s.write('hello')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string argument expected, got 'str'
>>> s.write(u'hello')
5L
>>> s.getvalue()
u'hello'

Ответ 3

Вы говорите: "Это может быть не очевидно, но если вы использовали StringIO для обработки двоичных данных, вам не повезло с Python 2.7 или новее".

Это не очевидно, потому что это неверно.

Если у вас есть код, который работает с 2.6 или более ранним, он продолжает работать с 2,7. Неотредактированный дамп экрана (оболочка окна командной строки Windows в колонке 80 и все):

C:\Users\John>\python26\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr
ite('hello\n');print repr(s.getvalue()), sys.version"
'hello\n' 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)]

C:\Users\John>\python27\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr
ite('hello\n');print repr(s.getvalue()), sys.version"
'hello\n' 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)]

Если вам нужно написать код, который работает в версиях 2.7 и 3.x, используйте класс BytesIO в модуле io.

Если вам нужна/нужна одна кодовая база, которая поддерживает 2,7, 2,6,... и 3.x, вам придется работать немного сложнее. Использование six должен много помочь.