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