Замена StringIO, которая работает с байтами вместо строк? - PullRequest
60 голосов
/ 25 июня 2011

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

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

Ответы [ 3 ]

101 голосов
/ 25 июня 2011

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

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

10 голосов
/ 25 июня 2011

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

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

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

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

В версиях 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'
7 голосов
/ 26 июня 2011

Вы говорите: " Это может быть неочевидно, но если вы использовали 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 должно очень помочь.

...