2011-04-03 15 views
28

Tengo un script de python que genera unicode en la consola, y me gustaría redirigirlo a un archivo. Aparentemente, el proceso de redirección en python implica convertir el resultado en una cadena, por lo que recibo errores sobre la incapacidad de decodificar caracteres Unicode.¿Puedo redirigir la salida de Unicode de la consola directamente a un archivo?

Entonces, ¿hay alguna manera de realizar una redirección a un archivo codificado en UTF-8?

+1

Posible duplicado de [Configuración de la codificación correcta cuando se corta la tubería en Python] (http://stackoverflow.com/questions/492483/setting-the-correct-encoding-when-piping-stdout-in-python) – techraf

Respuesta

28

Al imprimir en la consola, Python mira sys.stdout.encoding para determinar la codificación que se utilizará para codificar objetos Unicode antes de imprimir.

Al redirigir la salida a un archivo, sys.stdout.encoding es Ninguno, por lo que Python2 tiene como valor predeterminado la codificación ascii. (En contraste, Python3 se establece de manera predeterminada en utf-8). Esto a menudo genera una excepción al imprimir unicode.

Puede evitar el error mediante la codificación de forma explícita el Unicode a sí mismo antes de la impresión:

print (unicode_obj.encode('utf-8')) 

o podría redefinir sys.stdout por lo que toda la salida se codifica en utf-8:

import sys 
import codecs 
sys.stdout=codecs.getwriter('utf-8')(sys.stdout) 
print(unicode_obj) 
+0

Intenté codificar mi cadena antes de imprimirla en la consola. Mi archivo tiene el símbolo b y \ x01 ... puntos de código ... Cuando escribió en el archivo, no fue decodificado – Malwaregeek

3
import codecs 
file_object = codecs.open("filename", "w", "utf-8") 
file_object.write(u"खऔणन") 
file_object.close() 


Esto debería hacer el trabajo.

+0

wah wah wah modificación adicional wah wah wah ... aceptado por necesidad. – Alex

+0

que es apenas una modificación –

+0

Es una modificación fundamental, ya que * obliga * a escribir en un archivo, evitando utilizar el script con un * shell * redirección. – MestreLion

11

Establecer la variable de entorno PYTHONIOENCODING a la codificación que desee antes de redireccionar una secuencia de comandos python a un archivo. Entonces no tendrá que modificar el script original. Asegúrese de escribir Unicode cadenas también, de lo contrario PYTHONIOENCODING no tendrá ningún efecto. Si escribe cadenas de bytes, los bytes se envían tal como están al terminal (o al archivo redirigido).

+0

Ejecutar 'PYTHONENCODING = utf8 script.py' no funciona para mí en absoluto. Ni PYTHONSTDENCODING que vi propuso en otro lugar. Tal vez lo estoy haciendo mal. – qwertyboy

+1

@qwertyboy, lo estás haciendo mal. Ninguno de esos deletreos es la ortografía en mi respuesta. –

+0

Tienes razón, por supuesto. Perdón por eso, (era una hora tardía) y gracias. Pero eventualmente intenté tu ortografía también, aquí hay una copia de mi terminal: 'PYTHONIOENCODING = utf-8 ./quote.py> log.txt', y no funcionó. El comando de archivo genera 'log.txt: Texto ASCII extendido no ISO' – qwertyboy

4

En Linux, puede usar tee y redirigir stderr a/dev/null.

python script.py 2>/dev/null | tee filename.txt 

Tampoco necesita modificar su secuencia de comandos de Python.

Cuestiones relacionadas