Python "SyntaxError: carattere non ASCII '\ xe2' nel file"


179

Sto scrivendo un po 'di codice Python e sto ricevendo il messaggio di errore come nel titolo, dalla ricerca questo ha a che fare con il set di caratteri.

Ecco la riga che causa l'errore

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

Non riesco a capire quale personaggio non è nel set ANSI ASCII? Inoltre, la ricerca di "\ xe2" non fornisce più informazioni sul personaggio che appare come. Quale personaggio in quella riga sta causando il problema?

Ho anche visto alcune correzioni per questo problema, ma non sono sicuro di quale utilizzare. Qualcuno potrebbe chiarire qual è il problema (python non interpreta l'unicode se non gli viene detto di farlo?), E come lo chiarirei correttamente?

EDIT: qui ci sono tutte le linee vicino a quella che sbaglia

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

63
aggiungi # coding: utf-8 in cima al file.
Mutante

2
Non ci sono problemi in ciò che hai pubblicato; guarda nelle linee vicine.
kindall

Hai aggiunto un tipo di modifica, vedi qualcosa in quelle righe?
KDecker,

3
Hai provato il suggerimento di Mutant? Hai "virgolette intelligenti" (il tipo curvo e / o inclinato) in qualsiasi parte del file?
John Y,

2
Un esempio che potrebbe causarlo è un EN DASH ( - \xe2\x80\x93)
Martin Thoma,

Risposte:


145

Hai un byte randagio che fluttua intorno. Puoi trovarlo correndo

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

dove dovresti sostituire "x.py"con il nome del tuo programma. Vedrai il numero della linea e le linee offensive. Ad esempio, dopo aver inserito quel byte in modo arbitrario, ho ottenuto:

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

2
Grazie, questo mi ha aiutato molto! Non sono ancora sicuro di quale sia / sia stata la carta. Ho finito per lanciare il codice nel blocco note e salvarlo come ASCII, quindi incollarlo.
KDecker,

Ho affrontato anche questo, che penso fosse dovuto a un problema di copia e incolla, in cui il personaggio appariva come spazio bianco nell'editor (vim).
Samveen,

Potrebbe essere necessario che Python sappia che tali personaggi sono lì per una ragione e non solo per un byte randagio. Vedi la soluzione nella risposta di Chris Redford.
Simplyharsh

7
Ho avuto lo stesso problema, il carattere \ xe2 faceva parte di un trattino "-" (\ xe2 \ x80 \ x93), ma leggermente più lungo degli ascii "-". Questo perché ho incollato il testo in VIM, ma non ho prestato attenzione a questo trattino più lungo. Per la storia completa, ho prodotto questo personaggio con un doppio trattino "-" in un testo wiki (usando il tessuto)
PlasmaBinturong

1
Il mio era in un apostrofo - come inO'Donnell
user2490003

278

Se stai solo cercando di utilizzare i caratteri UTF-8 o non ti importa se sono nel tuo codice, aggiungi questa riga nella parte superiore del .pyfile

# -*- coding: utf-8 -*-

1
per me non funziona. sotto l'errore mostra sempre. SintassiError: carattere non ASCII '\ xe2' nel file /home/aslam/projects/deva_26nov/mylibrary/email_constants.py alla riga 393, ma nessuna codifica dichiarata; vedi python.org/peps/pep-0263.html per i dettagli
Aslam Khan

2
C'è un motivo per cui questa non è una risposta scelta?
cph

@cph L'ho scritto 4 mesi dopo la domanda :)
Chris Redford,

@cph perché, sebbene sia molto utile, la risposta scelta risponde alla domanda "quale personaggio non è nel set ANSI ASCII?" Entrambe sono buone risposte però e la prima di solito vince in quel caso.
Arthur Dent,

39

Oppure potresti semplicemente usare:

# coding: utf-8

nella parte superiore del file .py


27

\ xe2 è il carattere "-", appare in alcune copie e incolla utilizza un diverso "-" aspetto uguale che causa errori di codifica. Sostituisci "-" (da copia incolla) con il corretto "-" (dal pulsante della tastiera).


3
molte grazie ! nel mio caso era il carattere ""
pietà,

23

Cambia la codifica dei caratteri del file,

mettere sempre la riga sotto all'inizio del codice

# -*- coding: utf-8 -*-

10

Ho avuto lo stesso errore durante la copia e incolla di un commento dal web

Per me era una sola virgoletta (') nella parola

L'ho appena cancellato e riscritto.


Ho avuto lo stesso errore, ma durante i test a livello locale non si è rotto e ha funzionato. Ma quando è stato eseguito sul server ha dato quell'errore di codifica. Ho dovuto sostituire i singoli commenti alla versione utf-8.
shivgre


4

Ho ricevuto questo errore per i personaggi nei miei commenti (dalla copia / incolla del contenuto dal Web nel mio editor per scopi di annotazione).

Per risolvere in Text Wrangler:

  1. Evidenzia il testo
  2. Vai al menu Testo
  3. Seleziona "Converti in ASCII"

2
L'opzione è stata cambiata in text-> zap gremlins, nelle versioni successive di TextWrangler ma ha funzionato per me :-)
TheMethod,

4

Basato su PEP 0263 - Definizione delle codifiche del codice sorgente di 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> :

tuttavia ha funzionato dal primo commento alla domanda, la risposta contiene la spiegazione. grazie
WebComer il

3

Ho avuto lo stesso problema e l'ho appena aggiunto all'inizio del mio file (in Python 3 non avevo il problema ma lo facevo in Python 2

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

2

Dopo circa mezz'ora di guardare attraverso lo stack overflow, mi sono reso conto che se l'uso di una singola virgoletta "'" in un commento passasse attraverso l'errore:

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

Dopo aver visto il traceback sono stato in grado di individuare la singola citazione utilizzata nel mio commento.


2

Se aiuta qualcuno, per me è successo perché stavo cercando di eseguire un'implementazione di Django in Python 3.4 con il mio comando Python 2.7


Non usavo Django, ma questo mi ha comunque aiutato. Ho scritto lo script usando Python 3 e ho provato a eseguirlo con Python 2. L'errore è scomparso quando l'ho eseguito con la versione corretta. Grazie!
JustBlossom,

1

Ho avuto questo esatto problema con il semplice codice .py di seguito:

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

Il codice DSM sopra riportato prevedeva quanto segue:

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

Quindi il problema era che il mio editor di testo utilizzava PREVENTIVI SMART, come suggerito da John Y. Dopo aver modificato le impostazioni dell'editor di testo e riaperto / salvato il file, funziona perfettamente.


1

Sto cercando di analizzare quella strana apostraphe di Windows e dopo aver provato diverse cose qui è lo snippet di codice che funziona.

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)

0

Ho avuto lo stesso problema ma era perché ho copiato e incollato la stringa così com'è. Più tardi, quando ho digitato manualmente la stringa in quanto l'errore è scomparso.

Ho avuto l'errore dovuto al -segno. Quando l'ho sostituito con l'inserimento manuale di un -errore è stato risolto.

Stringa copiata 10 + 3 * 5/(16 − 4)

Stringa digitata manualmente 10 + 3 * 5/(16 - 4)

puoi vedere chiaramente che c'è una piccola differenza tra i due trattini .

Penso che sia a causa della diversa formattazione utilizzata da diversi sistemi operativi o forse solo software diverso.


0

Per me il problema era stato causato da "" quel simbolo tra virgolette. Come avevo copiato il codice da un file pdf ha causato quell'errore. Ho appena sostituito "" con questo "" ".


0

Se vuoi individuare quale personaggio ha causato questo, basta assegnare la variabile problematica a una stringa e stamparla in una console iPython.

Nel mio 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!

0

per me, il problema è stato causato digitando il mio codice in Mac Notes e poi copiandolo da Mac Notes e incollandolo nella mia sessione di vim per creare il mio file. Questo ha reso le mie virgolette singole di tipo curvo. per risolverlo ho aperto il mio file in vim e ho sostituito tutte le virgolette singole curve con il tipo semplice, semplicemente rimuovendo e digitando nuovamente lo stesso carattere. Sono state le Note Mac a fare in modo che lo stesso tratto chiave producesse la virgoletta singola curva.


0

Non sono riuscito a trovare il problema per molto tempo, ma in seguito mi sono reso conto che avevo copiato una riga "UTC-12: 00" dal web e il trattino / trattino in questo stava causando il problema. Ho appena scritto questo "-" di nuovo e il problema è stato risolto.

Quindi, a volte le righe incollate copiano anche errori. In questi casi, basta riscrivere il codice incollato e funziona. Al momento della riscrittura, sembrerebbe che nulla sia cambiato ma l'errore sparirà.


-1

Quando ho un problema simile durante la lettura di file di testo che uso ...

f = open('file','rt', errors='ignore')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.