Python y redireccionar utf-8 a un fichero
febrero 23, 2012 Deja un comentario
Un problema recurrente en python son los problemas con el encoding y concretamente uno de ellos es el problema de redireccionar la salida a un fichero.
Es bastante habitual escribir a la salida estándar información y cuando esta es demasiada para verla o analizarla a simple vista, es muy normal redirigir la salida a un fichero, y entonces BOOM, todo explota. Veamos un ejemplo:
Creo un fichero, que vamos a llamar utf-8.py y que contiene:
#!/usr/bin/env python # -*- coding: utf-8 -*- print u"¡Hola mundo!"
Al ejecutarlo normalmente “python utf-8.py”, obtenemos como resultado, lo esperado ¡Hola mundo!, pero si lo redirigimos a un fichero “python utf-8.py > /dev/null” casca nuestra aplicación.
Traceback (most recent call last): File "utf-8.py", line 3, in <module> print u"¡Hola mundo!" UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128)
Esto se debe a que python por defecto abre sus ficheros por defecto con codificación ascii, y por tanto, al abrir el fichero al que intentamos redirigir lo abre con codificación ascii, que no entiende los caracteres utf-8 que le hemos pasado (en este caso el carácter ¡).
Bien, una vez entendido cual es el problema, la solución es fácil, hay que decirle a python con que encoding por defecto se tienen que abrir los ficheros, y esto se hace a través de la variable de entorno PYTHONIOENCODING.
export PYTHONIOENCODING=utf-8 python utf-8.py > /dev/null
Y todo va perfectamente.