[pyar] Problema con encoding

Andrés Gattinoni andresgattinoni en gmail.com
Mar Jul 26 13:02:29 ART 2011


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?



More information about the pyar mailing list