Python: como fazer com que o stringio.WriteLines aceite a String Unicode?
Pergunta
Estou recebendo um
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 34: ordinal not in range(128)
Em uma string armazenada em 'A.Desc' abaixo, pois contém o caractere '£'. Ele é armazenado no armazenamento de dados de mecanismo do Google App subjacente como uma string Unicode, então tudo bem. A função CStringio.Stringio.Writelines está tentando aparentemente tentar codificá -la no formato ASCII:
result.writelines(['blahblah',a.desc,'blahblahblah'])
Como faço para instruí -lo a tratar a codificação como unicode se esse é o fraseado correto?
O App Engine é executado no Python 2.5
Solução
Ao contrário dos arquivos de memória implementados pelo módulo Stringio, os fornecidos por [CStringio] não podem aceitar strings Unicode que não podem ser codificados como strings ASCII simples.
Se possível, use Stringio em vez de CStringio.
Outras dicas
Você pode embrulhar o objeto Stringio em um codecs.StreamReaderWriter
Objeto para codificar e decodificar automaticamente o Unicode.
Assim:
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
será preenchido com bytes codificados UTF-8.
Se eu entender o seu caso corretamente, você só precisará escrever, para que você também possa fazer:
import cStringIO, codecs
buffer = cStringIO.StringIO()
wrapper = codecs.getwriter("utf8")(buffer)
Você também pode codificar sua string como UTF-8 manualmente antes de adicioná-la ao Stringio
for val in rows:
if isinstance(val, unicode):
val = val.encode('utf-8')
result.writelines(rows)
Python 2.6 introduziu o io
módulo e você deve considerar usar io.StringIO()
, "Um fluxo na memória para texto unicode".
Nas versões mais antigas do Python, isso não é otimizado (python puro), em versões posteriores, isso foi otimizado para (rápido) o código C.