xticks barplot python python-3.x unicode encoding stdin

python - barplot - pandas plot



Python 3: Cómo especificar la codificación estándar (1)

Al portar el código de Python 2 a Python 3, me encuentro con este problema al leer el texto UTF-8 de la entrada estándar. En Python 2, esto funciona bien:

for line in sys.stdin: ...

Pero Python 3 espera ASCII de sys.stdin , y si hay caracteres que no son ASCII en la entrada, recibo el error:

UnicodeDecodeError: el codec ''ascii'' no puede decodificar el byte ... en la posición ..: ordinal no está en el rango (128)

Para un archivo normal, especificaría la codificación al abrir el archivo:

with open(''filename'', ''r'', encoding=''utf-8'') as file: for line in file: ...

Pero, ¿cómo puedo especificar la codificación para la entrada estándar? Otras publicaciones de SO han sugerido usar

input_stream = codecs.getreader(''utf-8'')(sys.stdin) for line in input_stream: ...

Sin embargo, esto no funciona en Python 3. Sigo recibiendo el mismo mensaje de error. Estoy usando Ubuntu 12.04.2 y mi configuración regional está establecida en en_US.UTF-8.


Python 3 no espera ASCII de sys.stdin . stdin la stdin en modo de texto y hará una conjetura informada sobre qué codificación se utiliza. Esa suposición puede reducirse a ASCII , pero eso no es un hecho. Consulte la documentación de sys.stdin sobre cómo se selecciona el códec.

Al igual que otros objetos de archivo abiertos en modo de texto, el objeto sys.stdin deriva de la clase base io.TextIOBase ; tiene un atributo .buffer apunta a la instancia de IO en búfer subyacente (que a su vez tiene un atributo .raw ).

Envuelva el atributo sys.stdin.buffer en una nueva instancia de io.TextIOWrapper() para especificar una codificación diferente:

import io import sys input_stream = io.TextIOWrapper(sys.stdin.buffer, encoding=''utf-8'')

Alternativamente, configure la variable de entorno PYTHONIOENCODING al códec deseado al ejecutar python.

Desde Python 3.7 en adelante, también puede reconfigurar los envoltorios std* existentes , siempre que lo haga al inicio (antes de que se haya leído cualquier dato):

# Python 3.7 and newer sys.stdin.reconfigure(encoding=''utf-8'')