web-dev-qa-db-fra.com

Python "SyntaxError: caractère non-ASCII '\ xe2' dans le fichier"

Je suis en train d'écrire du code python et je reçois le message d'erreur comme dans le titre. La recherche concerne le jeu de caractères. 

Voici la ligne qui cause l'erreur

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

Je ne peux pas déterminer quel caractère ne figure pas dans l'ensemble ANSI ASCII? De plus, la recherche sur "\ xe2" ne donne plus d'informations sur le caractère qui apparaît. Quel personnage dans cette ligne est à l'origine du problème? 

J'ai également vu quelques correctifs pour ce problème mais je ne sais pas lequel utiliser. Quelqu'un pourrait-il clarifier la nature du problème (python n'interprète pas l'unicode sauf indication contraire?) Et comment le résoudre correctement?

EDIT: Voici toutes les lignes proches de celle en erreur

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
152
KDecker

Vous avez un octet parasite qui flotte. Vous pouvez le trouver en exécutant

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

où vous devez remplacer "x.py" par le nom de votre programme. Vous verrez le numéro de la ligne et les lignes incriminées. Par exemple, après l'insertion arbitraire de cet octet, j'ai obtenu:

4 "\xe2        lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])\n"
116
DSM

Si vous essayez simplement d'utiliser des caractères UTF-8 ou ne vous souciez pas de les insérer dans votre code, ajoutez cette ligne en haut de votre fichier .py.

# -*- coding: utf-8 -*-
228
Chris Redford

Ou vous pouvez simplement utiliser:

# coding: utf-8

au sommet du fichier .py

28
Ysh

Changer l'encodage des caractères du fichier,

mettre toujours sous la ligne en haut de votre code

# -*- coding: utf-8 -*-
20
Dadaso Zanzane

\ xe2 est le caractère '-', il apparaît dans certains copier-coller, il utilise un '-' identique qui provoque des erreurs d'encodage . Remplacez le '-' (de copier coller) par le bon '-' ( de votre bouton du clavier).

17
André Liu

J'ai eu la même erreur en copiant et collant un commentaire du Web

Pour moi c'était une simple citation (') dans la Parole 

Je viens de l'effacer et de le retaper.

9
khalid sookia

J'ai eu cette erreur pour les caractères dans mes commentaires (de copier/coller du contenu du Web dans mon éditeur pour prendre des notes). 

Pour résoudre dans Text Wrangler:  

  1. Surligner le texte
  2. Allez dans le menu texte
  3. Sélectionnez "Convertir en ASCII"
4
Kat Russo

Si cela aide quelqu'un, cela m'est arrivé parce que j'essayais d'exécuter une implémentation de Django en python 3.4 avec ma commande python 2.7

2
aless80

Après environ une demi-heure de recherche à travers le débordement de pile, il m’a semblé que si l’utilisation d’un seul guillemet "'" dans un commentaire passait par l’erreur:

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

Après avoir examiné l'historique, j'ai pu localiser la citation utilisée dans mon commentaire. 

2
Mark Austin

Basé sur PEP 0263 - Définition des codages de code source 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> :
2
caot

Ajouter la ligne # coding = utf-8 en première ligne de votre fichier .py résoudra le problème. 

Veuillez en savoir plus sur le problème et son correctif sur le lien ci-dessous. Dans cet article, le problème et sa solution sont décrits de manière élégante: https://www.python.org/dev/peps/pep-0263/

2
Bhupinder Yadav

J'ai eu ce problème exact en exécutant le code simple .py ci-dessous:

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

Le code de DSM ci-dessus fournit les éléments suivants:

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

Le problème était donc que mon éditeur de texte utilisait les citations SMART, comme l'a suggéré John Y. Après avoir modifié les paramètres de l’éditeur de texte et rouvert/sauvegardé le fichier, cela fonctionne parfaitement.

1
nagrom

J'essaie d'analyser cet étrange apostraphe Windows et après avoir essayé plusieurs choses, voici l'extrait de code qui fonctionne.

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)
1
Chris

Pour moi, le problème avait été causé par "’ "ce symbole dans les guillemets. Comme j'avais copié le code d'un fichier pdf, cela a causé cette erreur. Je viens de remplacer "" "par ce" "".

0
Vineet Bramhankar

Si vous voulez identifier le caractère qui a causé cela, assignez simplement la variable problématique à une chaîne et imprimez-la dans une console iPython.

Dans mon cas

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!
0
meowmeow

J'avais le même problème et je l'ai simplement ajouté en haut de mon fichier (en Python 3, je n'avais pas le problème mais je le fais en Python 2

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

J'ai eu le même problème, mais c'est parce que j'ai copié et collé la chaîne telle qu'elle est . Plus tard, lorsque j'ai saisi manuellement la chaîne car l'erreur a disparu. 

J'ai eu l'erreur due au signe -. Lorsque je l'ai remplacé par la saisie manuelle d'un -, l'erreur a été résolue.

Chaîne copiée 10 + 3 * 5/(16 − 4)

Chaîne saisie manuellement 10 + 3 * 5/(16 - 4)

vous pouvez clairement voir qu'il y a un peu de différence entre les tirets.

Je pense que cela est dû au formatage différent utilisé par un système d'exploitation différent ou peut-être simplement à un logiciel différent.

0
Mahi

pour moi, le problème était causé par la saisie de mon code dans Mac Notes, puis copié-le à partir de Mac Notes et collé dans ma session vim pour créer mon fichier. Cela rend mon single cite le type incurvé. pour résoudre ce problème, j'ai ouvert mon fichier dans vim et remplacé toutes mes guillemets simples courbes par des caractères simples, simplement en supprimant et en retapant le même caractère. C'est Mac Notes qui a fait en sorte que le même trait de touche produise la citation simple incurvée.

0
double07robinhood