Есть ли замена для класса python StringIO
, который будет работать с bytes
вместо строк?
Это может быть не очевидно, но если вы использовали StringIO для обработки двоичных данных, вам не повезло с Python 2.7 или новее.
Есть ли замена для класса python StringIO
, который будет работать с bytes
вместо строк?
Это может быть не очевидно, но если вы использовали StringIO для обработки двоичных данных, вам не повезло с Python 2.7 или новее.
Попробуйте io.BytesIO
.
Как другие указали, вы действительно можете использовать StringIO
в 2.7, но BytesIO
является хорошим выбором для передовой совместимости.
В 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'
Вы говорите: "Это может быть не очевидно, но если вы использовали 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 должен много помочь.