[pyar] Problema con encoding

Mariano Reingart reingart en gmail.com
Mar Jul 26 13:07:11 ART 2011


2011/7/26 Andrés Gattinoni <andresgattinoni en gmail.com>:
> 2011/7/26 Mariano Reingart <reingart en gmail.com>:
>>> No entiendo por qué un string puedo imprimirlo sin problemas, pero
>>> cuando lo quiero escribir en una archivo se rompe todo.
>>> Qué se me está escapando?
>>
>> Los archivos no tienen encoding por defecto, por eso falla .
>> De hecho, el print anda porque lo ejecutas en la consola, si
>> redireccionas la salida, también posiblemente va a fallar.
>
> Tenés razón, si redirecciono la salida cuando quiero abrir el archivo
> me muestra el mismo quilombo binario.
>
>> http://wiki.python.org/moin/PrintFails
>>
>> Si no me equivoco, tendrías que decodear el string para abrir el
>> archivo (cosa que hace codecs.open), y encodearlo para imprimirlo:
>>
>> f.write(rendered.encode("utf8"))
>
> Lo probé pero también me da error:
>
> Traceback (most recent call last):
>  File "process.py", line 66, in <module>
>    sys.exit(main(sys.argv))
>  File "process.py", line 63, in main
>    render('./index.html', 'templates/index.tpl', data)
>  File "process.py", line 15, in render
>    f.write(rendered.encode('utf8'))
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position
> 3352: ordinal not in range(128)
>
>
>> Tambièn podrìas usar codecs.open en la salida para evitarlo, pero no
>> es del todo seguro si no sabés que se va a escribir.
>
> A qué salida te referís? Actualmente estoy abriendo con codecs.open
> tanto el archivo que tiene el template como el que quiero escribir.
>
> #!/usr/bin/env python
> # -*- coding: utf-8 -*-
> import sys
> import codecs
> from gluon import template
>
> def render (filename, template_file, data):
>    tplfile = codecs.open(template_file, 'r', 'utf-8')
>    html = tplfile.read()
>    tplfile.close()
>    f = codecs.open(filename, 'w', 'utf-8')
>    #f = open(filename, 'w')
>    rendered = template.render(html, context=data)
>    print rendered
>    f.write(rendered.encode('utf8'))
>    f.close()
>
> Lo que yo pienso es, si la consola (que la tengo en utf-8) puede
> interpretar bien los caracteres cuando hago el print.
> Por qué no puedo escribirlos directamente (o traducidos a lo que
> corresponda) en el archivo?

Me parece que estas mezclando codecs y encode, calculo que si abris
con codecs le mandas unicodes directamente (sin "encodificar").
Si abris con el open comun, tenes que mandar string ("encodificando"
los unicodes al encoding que elijas).

Hace un print type(rendered) para ver que tipo es, y dependiendo del
caso, lo convertis a unicode o string segun el parrafo anterior.

Sds

Mariano Reingart
http://www.sistemasagiles.com.ar
http://reingart.blogspot.com



More information about the pyar mailing list