Python "SyntaxError: carácter no ASCII '\ xe2' en el archivo"

179

Estoy escribiendo un código de Python y recibo el mensaje de error como en el título, al buscar esto tiene que ver con el conjunto de caracteres.

Aquí está la línea que causa el error.

hc = HealthCheck("instance_health", interval=15, target808="HTTP:8080/index.html")

No puedo entender qué carácter no está en el conjunto ANSI ASCII? Además, la búsqueda "\ xe2" ya no proporciona información sobre el carácter que aparece como. ¿Qué personaje de esa línea está causando el problema?

También he visto algunas soluciones para este problema, pero no estoy seguro de cuál usar. ¿Podría alguien aclarar cuál es el problema (python no interpreta unicode a menos que se lo indiquen) y cómo lo aclararía correctamente?

EDITAR: Aquí están todas las líneas cerca de la que errores

def createLoadBalancer():
    conn = ELBConnection(creds.awsAccessKey, creds.awsSecretKey)
    hc = HealthCheck("instance_health", interval=15, target808="HTTP:8080/index.html")
    lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])
    lb.configure_health_check(hc)
    return lb
KDecker
fuente
63
agregue # codificación: utf-8 en la parte superior del archivo.
Mutante
2
No hay problema en lo que publicaste; mira en las líneas cercanas.
poco
Se agregó un poco de edición, ¿ves algo en esas líneas?
KDecker
3
¿Intentaste la sugerencia de Mutante? ¿Tiene "comillas inteligentes" (del tipo curvo y / o angulado) en alguna parte del archivo?
John Y
2
Un ejemplo que podría causarlo es un EN DASH ( - \xe2\x80\x93)
Martin Thoma

Respuestas:

145

Tienes un byte perdido flotando. Puedes encontrarlo ejecutando

with open("x.py") as fp:
    for i, line in enumerate(fp):
        if "\xe2" in line:
            print i, repr(line)

donde debe reemplazar "x.py"por el nombre de su programa. Verá el número de línea y las líneas ofensivas. Por ejemplo, después de insertar ese byte arbitrariamente, obtuve:

4 "\xe2        lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])\n"
DSM
fuente
2
¡Gracias, esto ayudó mucho! Todavía no estoy seguro de cuál es / fue el estatuto. Terminé arrojando el código en el bloc de notas y guardando como ASCII, y luego pegando.
KDecker
También me enfrenté a esto, lo que creo que se debió a un problema de copiar y pegar, donde el personaje apareció como espacio en blanco en el editor (vim).
Samveen
Puede ser necesario que Python sepa que tales caracteres están ahí por una razón y no solo por un byte perdido. Vea la solución en la respuesta de Chris Redford.
simplemente duro
77
Tuve el mismo problema, el carácter \ xe2 era parte de un guión "-" (\ xe2 \ x80 \ x93), pero un poco más largo que el ascii "-". Eso es porque pegué el texto en vim, pero no presté atención a este guión más largo. Para la historia completa,
produje
1
La mía estaba en un apóstrofe - como enO'Donnell
user2490003
278

Si solo está tratando de usar caracteres UTF-8 o no le importa si están en su código, agregue esta línea en la parte superior de su .pyarchivo

# -*- coding: utf-8 -*-
Chris Redford
fuente
1
para mí no funciona debajo del error que se muestra siempre. SyntaxError: carácter no ASCII '\ xe2' en el archivo /home/aslam/projects/deva_26nov/mylibrary/email_constants.py en la línea 393, pero no se ha declarado ninguna codificación; ver python.org/peps/pep-0263.html para más detalles
Aslam Khan
2
¿Hay alguna razón por la que esta no es una respuesta elegida?
cph
@cph Lo escribí 4 meses después de que se hiciera la pregunta :)
Chris Redford
@cph porque, si bien esto es muy útil, la respuesta elegida responde a la pregunta "¿qué carácter no está en el conjunto ANSI ASCII?" Sin embargo, ambas son buenas respuestas y la primera generalmente gana en ese caso.
Arthur Dent
39

O simplemente podría usar:

# coding: utf-8

en la parte superior del archivo .py

Ysh
fuente
27

\ xe2 es el carácter '-', aparece en algunas copias y pega, usa un aspecto igual '-' diferente que causa errores de codificación. Reemplace el '-' (de copiar y pegar) con el correcto '-' (desde el botón del teclado).

André Liu
fuente
3
muchas gracias ! en mi caso era el personaje "'"
pietà
23

Cambiar la codificación de caracteres del archivo,

poner debajo de la línea al principio de su código siempre

# -*- coding: utf-8 -*-
Dadaso Zanzane
fuente
10

Tuve el mismo error al copiar y pegar un comentario de la web

Para mí fue una comilla simple (') en la palabra

Simplemente lo borré y lo volví a escribir.

khalid sookia
fuente
Tuve el mismo error, pero mientras probaba localmente no se rompió y funcionó. Pero cuando se ejecutó en el servidor, dio ese error de codificación. Tuve que reemplazar los comentarios de comillas simples a la versión utf-8.
shivgre
8

Agregar # coding = línea utf-8 en la primera línea de su archivo .py solucionará el problema.

Lea más sobre el problema y su solución en el siguiente enlace, en este artículo, el problema y su solución se describen maravillosamente: https://www.python.org/dev/peps/pep-0263/

Bhupinder Yadav
fuente
4

Recibí este error para los caracteres en mis comentarios (de copiar / pegar contenido de la web en mi editor para tomar notas).

Para resolver en Text Wrangler:

  1. Resalta el texto
  2. Ir al menú de texto
  3. Seleccione "Convertir a ASCII"
Kat Russo
fuente
2
La opción se ha cambiado a texto-> zap gremlins, en versiones posteriores de TextWrangler, pero funcionó para mí :-)
TheMethod
4

Basado en PEP 0263 - Definición de codificaciones de código fuente de Python

Python will default to ASCII as standard encoding if no other
encoding hints are given.

To define a source code encoding, a magic comment must
be placed into the source files either as first or second
line in the file, such as:

      # coding=<encoding name>

or (using formats recognized by popular editors)

      #!/usr/bin/python
      # -*- coding: <encoding name> -*-

or

      #!/usr/bin/python
      # vim: set fileencoding=<encoding name> :
caotín
fuente
Sin embargo, funcionó desde el primer comentario hasta la pregunta, la respuesta contiene la explicación. gracias
WebComer
3

Tuve el mismo problema y acabo de agregar esto a la parte superior de mi archivo (en Python 3 no tuve el problema pero sí en Python 2

#!/usr/local/bin/python
# coding: latin-1
Paul Z
fuente
2

Después de aproximadamente media hora de mirar a través del desbordamiento de la pila, me di cuenta de que si el uso de una comilla simple "'" en un comentario pasaría por el error:

SyntaxError: Non-ASCII character '\xe2' in file

Después de mirar el rastreo, pude localizar la comilla simple utilizada en mi comentario.

Mark Austin
fuente
2

Si ayuda a alguien, eso sucedió porque estaba tratando de ejecutar una implementación de Django en python 3.4 con mi comando python 2.7

aless80
fuente
No estaba usando Django, pero esto todavía me ayudó. Escribí el script usando python 3 e intenté ejecutarlo con python 2. El error desapareció cuando lo ejecuté con la versión correcta. ¡Gracias!
JustBlossom
1

Tuve este problema exacto al ejecutar el código .py simple a continuación:

import sys
print 'version is:', sys.version

El código de DSM anterior proporcionó lo siguiente:

1 'print \ xe2 \ x80 \ x98version es \ xe2 \ x80 \ x99, sys.version'

Entonces, el problema era que mi editor de texto usaba CITAS INTELIGENTES, como sugirió John Y Después de cambiar la configuración del editor de texto y volver a abrir / guardar el archivo, funciona bien.

nagrom
fuente
1

Estoy tratando de analizar ese extraño apostraphe de Windows y después de probar varias cosas aquí, es el fragmento de código que funciona.

def convert_freaking_apostrophe(self,string):

   try:
      issuer_rename = string.decode('windows-1252')
   except:
      issuer_rename = string.decode('latin-1')
   issuer_rename = issuer_rename.replace(u'’', u"'")
   issuer_rename = issuer_rename.encode('ascii','ignore')
   try:
      os.rename(directory+"/"+issuer,directory+"/"+issuer_rename)
      print "Successfully renamed "+issuer+" to "+issuer_rename
      return issuer_rename
   except:
      pass

#HANDLING FOR FUNKY APOSTRAPHE
if re.search(r"([\x90-\xff])", issuer):
   issuer = self.convert_freaking_apostrophe(issuer)
Chris
fuente
0

Tuve el mismo problema, pero fue porque copié y pegué la cadena tal como está. Más tarde, cuando escribí manualmente la cadena, ya que el error desapareció.

Tuve el error debido a la -señal. Cuando lo reemplacé con la introducción manual de un -error se resolvió.

Cadena copiada 10 + 3 * 5/(16 − 4)

Cadena escrita manualmente 10 + 3 * 5/(16 - 4)

Puedes ver claramente que hay una pequeña diferencia entre ambos guiones .

Creo que se debe al diferente formato utilizado por diferentes sistemas operativos o tal vez solo por un software diferente.

Mahi
fuente
0

Para mí, el problema había causado debido a "'" ese símbolo en las comillas. Como había copiado el código de un archivo pdf, causó ese error. Acabo de reemplazar "'" por este "'".

Vineet Bramhankar
fuente
0

Si desea detectar qué carácter causó esto, simplemente asigne la variable problemática a una cadena e imprímala en una consola iPython.

En mi caso

In [1]: array = [[24.9, 50.5]​, [11.2, 51.0]]        # Raises an error

In [2]: string = "[[24.9, 50.5]​, [11.2, 51.0]]"     # Manually paste the above array here

In [3]: string
Out [3]: '[[24.9, 50.5]\xe2\x80\x8b, [11.2, 51.0]]' # Here they are!
Miau miau
fuente
0

para mí, el problema fue causado al escribir mi código en Mac Notes y luego copiarlo de Mac Notes y pegarlo en mi sesión de vim para crear mi archivo. Esto hizo que mis comillas simples fueran del tipo curvo. Para solucionarlo, abrí mi archivo en vim y reemplacé todas mis comillas simples curvas con el tipo directo, simplemente quitando y volviendo a escribir el mismo carácter. Fueron Mac Notes las que hicieron que el mismo golpe de tecla produjera la comilla simple curva.

double07robinhood
fuente
0

No pude encontrar cuál es el problema por mucho tiempo, pero luego me di cuenta de que había copiado una línea "UTC-12: 00" de la web y el guión / guión que estaba causando el problema. Acabo de escribir este "-" nuevamente y el problema se resolvió.

Entonces, a veces las líneas de copia pegadas también dan errores. En tales casos, simplemente vuelva a escribir el código copiado y funciona. Al volver a escribir, parecería que nada ha cambiado, pero el error desaparecerá.

Sugandha Jain
fuente
-1

Cuando tengo un problema similar al leer archivos de texto, uso ...

f = open('file','rt', errors='ignore')
Leva
fuente