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

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

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

  • Python, UnicodeDecodeError
  • Python: UnicodeDecodeError: кодек ascii не может декодировать байт 0xef в позиции 0: порядковый номер не в диапазоне (128)
  • как получить символы юникода в URL-адресе django?
  • Эквивалент string.ascii_letters для строк unicode в python 2.x?
  • Заменить специальные символы эквивалентом ASCII
  • Преобразование октетов UTF-8 в юникодные коды
  • Любые ошибки с использованием unicode_literals в Python 2.6?
  • Преобразование строки Unicode в китайский символ
  • 3 Solutions collect form web for “Замена Python StringIO, которая работает с байтами вместо строк?”

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

    Как указывали другие , вы действительно можете использовать StringIO в 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 (из которых байты являются псевдонимами), и все виды использования «текста», обратитесь к типу Unicode. Кроме того, эти два типа не взаимозаменяемы в 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' 

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

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

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

    Interesting Posts
    Python - лучший язык программирования в мире.