type textiowrapper py3 instalar has got expected bytes attribute argument _io python unicode python-2.7 stringio

python - py3 - textiowrapper to string



¿Reemplazo Python StringIO que funciona con bytes en lugar de cadenas? (3)

¿Hay algún reemplazo para la clase Python StringIO , una que funcione con bytes lugar de cadenas?

Puede que no sea obvio, pero si usaste StringIO para procesar datos binarios no tienes suerte con Python 2.7 o posterior.


En Python 2.6 / 2.7, el módulo io está destinado a ser utilizado para compatibilidad con Python 3.X. De los documentos:

Nuevo en la versión 2.6.

El módulo io proporciona las interfaces de Python para el manejo de la secuencia. En Python 2.x, esto se propone como una alternativa al objeto de archivo integrado, pero en Python 3.x es la interfaz predeterminada para acceder a los archivos y las transmisiones.

Nota Dado que este módulo se ha diseñado principalmente para Python 3.x, debe tener en cuenta que todos los usos de "bytes" en este documento se refieren al tipo str (de los cuales bytes es un alias), y todos los usos de "texto" refiérase al tipo Unicode. Además, esos dos tipos no son intercambiables en las io API.

En versiones de Python anteriores a 3.X, el módulo StringIO contiene la versión heredada de StringIO, que a diferencia de io.StringIO se puede usar en versiones anteriores a 2.6 de Python:

>>> 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''


Pruebe io.BytesIO .

Como have señalado others , puede utilizar StringIO en 2.7, pero BytesIO es una buena opción para la compatibilidad con versiones anteriores.


Usted dice: " Puede que no sea obvio, pero si usó StringIO para procesar datos binarios no tiene suerte con Python 2.7 o posterior ".

No es obvio porque no es verdad.

Si tiene un código que funciona en 2.6 o anterior, continúa funcionando en 2.7 . Volcado de pantalla sin editar (Ventana de símbolo del sistema de Windows que se ajusta en col 80 y todo):

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)]

Si necesita escribir código que se ejecute en 2.7 y 3.x, use la clase BytesIO en el módulo io .

Si necesita / desea una base de código única que admita 2.7, 2.6, ... y 3.x, necesitará trabajar un poco más. Usar los six módulos debería ayudar mucho.