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'')