type textiowrapper python3 py3 instalar has got expected bytes attribute argument _io python string unicode ascii stringio

textiowrapper - Python: ¿Cómo hacer que StringIO.writelines acepte cadenas unicode?



textiowrapper to string (4)

Estoy recibiendo un

UnicodeEncodeError: ''ascii'' codec can''t encode character u''/xa3'' in position 34: ordinal not in range(128)

en una cadena almacenada en ''a.desc'' a continuación, ya que contiene el carácter ''£''. Se almacena en el almacén de datos subyacente de Google App Engine como una cadena Unicode, así que está bien. La función cStringIO.StringIO.writelines está intentando aparentemente codificarla en formato ascii:

result.writelines([''blahblah'',a.desc,''blahblahblah''])

¿Cómo le indico que trate la codificación como unicode si ese es el fraseo correcto?

el motor de la aplicación se ejecuta en python 2.5


Puede ajustar el objeto StringIO en un objeto codecs.StreamReaderWriter para codificar y decodificar automáticamente unicode.

Me gusta esto:

import cStringIO, codecs buffer = cStringIO.StringIO() codecinfo = codecs.lookup("utf8") wrapper = codecs.StreamReaderWriter(buffer, codecinfo.streamreader, codecinfo.streamwriter) wrapper.writelines([u"list of", u"unicode strings"])

buffer se rellenará con bytes codificados en utf-8.

Si entiendo tu caso correctamente, solo necesitarás escribir, por lo que también podrías:

import cStringIO, codecs buffer = cStringIO.StringIO() wrapper = codecs.getwriter("utf8")(buffer)


Python 2.6 introdujo el módulo io y debería considerar usar io.StringIO() , "Una secuencia en memoria para texto unicode".

En las versiones anteriores de Python esto no está optimizado (Python puro), en versiones posteriores esto se ha optimizado para el código C (rápido).


También puede codificar su cadena como utf-8 manualmente antes de agregarla a StringIO

for val in rows: if isinstance(val, unicode): val = val.encode(''utf-8'') result.writelines(rows)


Documentación de StringIO :

A diferencia de los archivos de memoria implementados por el módulo StringIO, los proporcionados por [cStringIO] no pueden aceptar cadenas Unicode que no puedan codificarse como cadenas simples ASCII.

Si es posible, use StringIO en lugar de cStringIO.