Impresión de caracteres no-ascii en python / jinja

El siguiente código funciona correctamente:

from jinja2 import Template mylist = ['some text \xc3'] template = Template('{{ list }}') print template.render(list=mylist) 

Cuando lo ejecuto, sale:

 ['some text \xc3'] 

Sin embargo, cuando bash imprimir el elemento de lista real, falla:

 template = Template('{{ list[0] }}') print template.render(list=mylist) 

El error es:

 UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128) 

Me gustaría encontrar una forma de imprimir el elemento individual de la lista de la misma manera que se imprime la lista completa, donde el carácter no ascii se representa con la notación \ x.

De los documentos de Jinja :

“Jinja2 está usando Unicode internamente, lo que significa que tiene que pasar los objetos Unicode a la función de renderización o las secuencias de caracteres que solo constan de caracteres ASCII”.

 mylist = [u'some text \xc3'] 

Nunca debes abrir un archivo codificado y no descodificarlo.

Debe leer la encoding de curl (por ejemplo, con la opción -i o -H ) y analizar los encabezados HTTP o el archivo de salida si la encoding no está especificada en los encabezados.

O, como alternativa a la curvatura, puede utilizar la biblioteca de requests que no requiere escribir en un archivo. La obtención de un recurso web se verá así:

 >>> r = requests.get('http://python.org') >>> r.content ' 

Donde el content ya está codificado siguiendo la especificación HTTP.

Como último enfoque, puede adivinar una encoding y reemplazar caracteres desconocidos. Esta sería la solución más fácil de implementar. Por ejemplo:

 with codecs.open(filename, encoding='utf-8', errors='replace') as fobj: ... 

Su enfoque siempre perderá información (si hay caracteres no ascii). Mis dos primeros enfoques nunca y el último solo si la encoding adivinada es incorrecta.

Me lo imaginé. La clave es hacer str.encode('string-escape')

Entonces, hice esto:

 template = Template('{{ list[0].encode("string-escape") }}') 

Y eso funcionó.

jla tiene razón para mi caso

Utilizo utf-8 para los archivos fuente de python, así que use el prefijo u que solucionó mi problema.