¿Cambiar la codificación predeterminada de Python?

Resuelto Ali Nadalizadeh asked hace 14 años • 14 respuestas

Tengo muchos problemas de "no puedo codificar" y "no puedo decodificar" con Python cuando ejecuto mis aplicaciones desde la consola. Pero en Eclipse PyDev IDE, la codificación de caracteres predeterminada está configurada en UTF-8 , y estoy bien.

Busqué para configurar la codificación predeterminada y la gente dice que Python elimina la sys.setdefaultencodingfunción al iniciar y que no podemos usarla.

Entonces, ¿cuál es la mejor solución para ello?

Ali Nadalizadeh avatar Feb 17 '10 03:02 Ali Nadalizadeh
Aceptado

Aquí hay un método más simple (truco) que le devuelve la setdefaultencoding()función que se eliminó sys:

import sys
# sys.setdefaultencoding() does not exist, here!
reload(sys)  # Reload does the trick!
sys.setdefaultencoding('UTF8')

(Nota para Python 3.4+: reload()está en la importlibbiblioteca).

Sin embargo, esto no es algo seguro : obviamente es un truco, ya que sys.setdefaultencoding()se elimina intencionalmente syscuando se inicia Python. Volver a habilitarlo y cambiar la codificación predeterminada puede romper el código que depende de que ASCII sea el predeterminado (este código puede ser de terceros, lo que generalmente haría imposible o peligroso arreglarlo).

PD: este truco ya no parece funcionar con Python 3.9.

Eric O. Lebigot avatar Jul 13 '2013 08:07 Eric O. Lebigot

Si recibe este error cuando intenta canalizar/redireccionar la salida de su script

UnicodeEncodeError: el códec 'ascii' no puede codificar caracteres en la posición 0-5: el ordinal no está en el rango (128)

Simplemente exporte PYTHONIOENCODINGen la consola y luego ejecute su código.

export PYTHONIOENCODING=utf8
iman avatar Nov 21 '2014 16:11 iman

A) Para controlar sys.getdefaultencoding()la salida:

python -c 'import sys; print(sys.getdefaultencoding())'

ascii

Entonces

echo "import sys; sys.setdefaultencoding('utf-16-be')" > sitecustomize.py

y

PYTHONPATH=".:$PYTHONPATH" python -c 'import sys; print(sys.getdefaultencoding())'

utf-16-be

Podrías poner tu sitecustomize.py más arriba en tu PYTHONPATH.

También te puede interesar probar reload(sys).setdefaultencodingpor @EOL

B) Para controlar stdin.encodingy stdout.encodingdesea configurar PYTHONIOENCODING:

python -c 'import sys; print(sys.stdin.encoding, sys.stdout.encoding)'

ascii ascii

Entonces

PYTHONIOENCODING="utf-16-be" python -c 'import sys; 
print(sys.stdin.encoding, sys.stdout.encoding)'

utf-16-be utf-16-be

Finalmente: ¡ puedes usar A) o B) o ambos!

lukmdo avatar Oct 25 '2011 16:10 lukmdo

A partir de PyDev 3.4.1, la codificación predeterminada ya no se cambia. Vea este boleto para más detalles.

Para versiones anteriores, una solución es asegurarse de que PyDev no se ejecute con UTF-8 como codificación predeterminada. En Eclipse, ejecute la configuración del cuadro de diálogo ("ejecutar configuraciones", si no recuerdo mal); puede elegir la codificación predeterminada en la pestaña común. Cámbielo a US-ASCII si desea tener estos errores "temprano" (en otras palabras: en su entorno PyDev). Consulte también una publicación de blog original sobre esta solución .

ChristopheD avatar Feb 16 '2010 20:02 ChristopheD

Con respecto a python2 (y solo a python2), algunas de las respuestas anteriores se basan en el siguiente truco:

import sys
reload(sys)  # Reload is a hack
sys.setdefaultencoding('UTF8')

Se desaconseja su uso (marque esto o esto )

En mi caso, tiene un efecto secundario: estoy usando cuadernos ipython y una vez que ejecuto el código, la función "imprimir" ya no funciona. Supongo que habría una solución, pero aún así creo que usar el truco no debería ser la opción correcta.

Después de probar muchas opciones, la que funcionó para mí fue usar el mismo código en el archivo sitecustomize.pydonde debe estar ese fragmento de código . Después de evaluar ese módulo, la función setdefaultencoding se elimina de sys.

Entonces la solución es agregar al archivo /usr/lib/python2.7/sitecustomize.pyel código:

import sys
sys.setdefaultencoding('UTF8')

Cuando uso virtualenvwrapper el archivo que edito es ~/.virtualenvs/venv-name/lib/python2.7/sitecustomize.py.

Y cuando lo uso con cuadernos de Python y Conda, es~/anaconda2/lib/python2.7/sitecustomize.py

kiril avatar Sep 16 '2016 13:09 kiril