Python “SyntaxError: Nicht-ASCII-Zeichen '\ xe2' in Datei”

179

Ich schreibe einen Python-Code und erhalte die Fehlermeldung wie im Titel. Die Suche hat mit dem Zeichensatz zu tun.

Hier ist die Zeile, die den Fehler verursacht

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

Ich kann nicht herausfinden, welches Zeichen nicht im ANSI-ASCII-Satz enthalten ist. Darüber hinaus gibt die Suche nach "\ xe2" keine weiteren Informationen darüber, als welches Zeichen angezeigt wird. Welches Zeichen in dieser Zeile verursacht das Problem?

Ich habe auch einige Korrekturen für dieses Problem gesehen, bin mir aber nicht sicher, welche ich verwenden soll. Könnte jemand klären, was das Problem ist (Python interpretiert Unicode nur, wenn er dazu aufgefordert wird?) Und wie ich es richtig klären würde?

EDIT: Hier sind alle Zeilen in der Nähe der fehlerhaften

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
quelle
63
# Codierung hinzufügen: utf-8 über der Datei.
Mutant
2
Es gibt kein Problem mit dem, was Sie gepostet haben. Schauen Sie in die nächsten Zeilen.
Kindall
Eine Bearbeitung hinzugefügt, sehen Sie etwas in diesen Zeilen?
KDecker
3
Haben Sie Mutants Vorschlag ausprobiert? Haben Sie irgendwo in der Datei "intelligente Anführungszeichen" (die gekrümmte und / oder abgewinkelte Art)?
John Y
2
Ein Beispiel, das es verursachen könnte, ist ein EN DASH ( - \xe2\x80\x93)
Martin Thoma

Antworten:

145

Sie haben ein streunendes Byte im Umlauf. Sie können es finden, indem Sie laufen

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

wo Sie "x.py"durch den Namen Ihres Programms ersetzen sollten . Sie sehen die Zeilennummer und die betreffenden Zeilen. Zum Beispiel habe ich nach dem willkürlichen Einfügen dieses Bytes Folgendes erhalten:

4 "\xe2        lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])\n"
DSM
quelle
2
Danke, das hat sehr geholfen! Ich bin mir immer noch nicht sicher, was die Charta ist / war. Am Ende warf ich den Code in den Editor, speicherte ihn als ASCII und fügte ihn dann ein.
KDecker
Ich war auch damit konfrontiert, was meiner Meinung nach auf ein Problem beim Kopieren und Einfügen zurückzuführen war, bei dem der Charakter im Editor (vim) als Leerzeichen angezeigt wurde.
Samveen
Möglicherweise muss Python wissen, dass solche Zeichen aus einem bestimmten Grund vorhanden sind und nicht nur aus einem Streubyte. Siehe die Lösung in Chris Redfords Antwort.
simplyharsh
7
Ich hatte das gleiche Problem, das Zeichen \ xe2 war Teil eines Bindestrichs "-" (\ xe2 \ x80 \ x93), aber etwas länger als das ASCII "-". Das liegt daran, dass ich Text in vim eingefügt habe, aber diesen längeren Bindestrich nicht beachtet habe. Für die ganze Geschichte habe ich diesen Charakter mit einem doppelten Bindestrich "-" in einem Wiki-Text (unter Verwendung von Textilien) produziert
PlasmaBinturong
1
Meins war in einem Apostroph - wie inO'Donnell
user2490003
277

Wenn Sie nur versuchen, UTF-8-Zeichen zu verwenden, oder es Ihnen egal ist, ob sie in Ihrem Code enthalten sind, fügen Sie diese Zeile oben in Ihre .pyDatei ein

# -*- coding: utf-8 -*-
Chris Redford
quelle
1
bei mir funktioniert es nicht. unter Fehler immer angezeigt. SyntaxError: Nicht-ASCII-Zeichen '\ xe2' in Datei /home/aslam/projects/deva_26nov/mylibrary/email_constants.py in Zeile 393, aber keine Codierung deklariert; Siehe python.org/peps/pep-0263.html für Details
Aslam Khan
2
Gibt es einen Grund, warum dies keine gewählte Antwort ist?
cph
@cph Ich schrieb es 4 Monate nachdem die Frage gestellt wurde :)
Chris Redford
@cph, da dies zwar sehr hilfreich ist, die gewählte Antwort jedoch die Frage beantwortet, welches Zeichen nicht im ANSI-ASCII-Satz enthalten ist. Beides sind gute Antworten und die erste gewinnt normalerweise in diesem Fall.
Arthur Dent
39

Oder Sie könnten einfach verwenden:

# coding: utf-8

oben in der .py-Datei

Ysh
quelle
27

\ xe2 ist das '-' Zeichen, es erscheint in einigen Kopier- und Einfügezeichen und verwendet ein anderes gleich aussehendes '-', das Codierungsfehler verursacht. Ersetzen Sie das '-' (aus Kopieren und Einfügen) durch das richtige '-' (von Ihrer Tastaturtaste).

André Liu
quelle
3
Vielen Dank ! in meinem Fall war es das "'" Zeichen
pietà
23

Ändern Sie die Codierung der Dateizeichen.

Setzen Sie die untere Zeile immer an die Spitze Ihres Codes

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

Ich hatte den gleichen Fehler beim Kopieren und Einfügen eines Kommentars aus dem Web

Für mich war es ein einfaches Zitat (') im Wort

Ich habe es einfach gelöscht und neu getippt.

khalid sookia
quelle
Ich hatte den gleichen Fehler, aber beim lokalen Testen ist es nicht kaputt gegangen und hat funktioniert. Aber wenn es auf dem Server ausgeführt wurde, gab es diesen Codierungsfehler. Musste die Kommentare einfaches Anführungszeichen auf utf-8 Version ersetzen.
Shivgre
8

Durch Hinzufügen der Zeile #oding = utf-8 in der ersten Zeile Ihrer .py-Datei wird das Problem behoben.

Bitte lesen Sie mehr über das Problem und seine Behebung unter dem folgenden Link. In diesem Artikel wird das Problem und seine Lösung ausführlich beschrieben: https://www.python.org/dev/peps/pep-0263/

Bhupinder Yadav
quelle
4

Ich habe diesen Fehler für Zeichen in meinen Kommentaren erhalten (durch Kopieren / Einfügen von Inhalten aus dem Web in meinen Editor zum Notieren).

So lösen Sie in Text Wrangler:

  1. Markieren Sie den Text
  2. Gehen Sie zum Menü Text
  3. Wählen Sie "In ASCII konvertieren"
Kat Russo
quelle
2
Option wurde in späteren Versionen von TextWrangler in text-> zap gremlins geändert, aber es hat bei mir funktioniert :-)
TheMethod
4

Basierend auf PEP 0263 - Definieren von Python-Quellcode-Codierungen

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
quelle
dennoch funktionierte es vom ersten Kommentar bis zur Frage, die Antwort enthält die Erklärung. danke
WebComer
3

Ich hatte das gleiche Problem und fügte es einfach oben in meine Datei ein (in Python 3 hatte ich das Problem nicht, aber in Python 2

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

Nach ungefähr einer halben Stunde des Durchsuchens des Stapelüberlaufs wurde mir klar, dass die Verwendung eines einfachen Anführungszeichens "'" in einem Kommentar den Fehler verursacht:

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

Nachdem ich mir den Traceback angesehen hatte, konnte ich das in meinem Kommentar verwendete einfache Zitat finden.

Mark Austin
quelle
2

Wenn es jemandem hilft, ist mir das passiert, weil ich versucht habe, eine Django-Implementierung in Python 3.4 mit meinem Befehl python 2.7 auszuführen

aless80
quelle
Ich habe Django nicht benutzt, aber das hat mir trotzdem geholfen. Ich habe das Skript mit Python 3 geschrieben und versucht, es mit Python 2 auszuführen. Der Fehler ist verschwunden, als ich es mit der richtigen Version ausgeführt habe. Vielen Dank!
JustBlossom
1

Ich hatte genau dieses Problem mit dem folgenden einfachen .py-Code:

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

Der obige DSM-Code enthielt Folgendes:

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

Das Problem war also, dass mein Texteditor SMART QUOTES verwendete, wie John Y vorschlug. Nachdem Sie die Einstellungen des Texteditors geändert und die Datei erneut geöffnet / gespeichert haben, funktioniert sie einwandfrei.

Nagrom
quelle
1

Ich versuche, diesen seltsamen Windows-Apostraphen zu analysieren, und nachdem ich einige Dinge ausprobiert habe, ist hier das Code-Snippet, das funktioniert.

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
quelle
0

Ich hatte das gleiche Problem, aber es lag daran, dass ich den String so kopiert und eingefügt habe, wie er ist. Später, als ich die Zeichenfolge manuell eingegeben habe, ist der Fehler verschwunden.

Ich hatte den Fehler aufgrund des -Zeichens. Als ich es durch manuelle Eingabe von a ersetzte- der Fehler behoben.

Kopierte Zeichenfolge 10 + 3 * 5/(16 − 4)

Manuell eingegebene Zeichenfolge 10 + 3 * 5/(16 - 4)

Sie können deutlich sehen, dass zwischen den beiden Bindestrichen ein kleiner Unterschied besteht .

Ich denke, das liegt an der unterschiedlichen Formatierung, die von verschiedenen Betriebssystemen oder vielleicht nur an unterschiedlicher Software verwendet wird.

Mahi
quelle
0

Für mich hatte das Problem durch "'" dieses Symbol in den Anführungszeichen verursacht. Da ich den Code aus einer PDF-Datei kopiert hatte, verursachte es diesen Fehler. Ich habe gerade "'" durch dieses "'" ersetzt.

Vineet Bramhankar
quelle
0

Wenn Sie herausfinden möchten, welches Zeichen dies verursacht hat, weisen Sie die problematische Variable einfach einer Zeichenfolge zu und drucken Sie sie in einer iPython-Konsole.

In meinem Fall

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
quelle
0

Für mich wurde das Problem dadurch verursacht, dass ich meinen Code in Mac Notes eingegeben und dann von Mac Notes kopiert und in meine vim-Sitzung eingefügt habe, um meine Datei zu erstellen. Dies machte meine einfachen Anführungszeichen zum gekrümmten Typ. Um dies zu beheben, öffnete ich meine Datei in vim und ersetzte alle meine gekrümmten einfachen Anführungszeichen durch die gerade Art, indem ich das gleiche Zeichen entfernte und erneut eingab. Es waren Mac Notes, die mit demselben Tastendruck das gekrümmte einfache Anführungszeichen erzeugten.

double07robinhood
quelle
0

Ich konnte das Problem lange nicht finden, aber später stellte ich fest, dass ich eine Zeile "UTC-12: 00" aus dem Web kopiert hatte und der Bindestrich / Bindestrich darin das Problem verursachte. Ich habe gerade dieses "-" noch einmal geschrieben und das Problem wurde behoben.

Manchmal geben die kopierten Zeilen auch Fehler. In solchen Fällen schreiben Sie den kopierten Code einfach neu und es funktioniert. Beim erneuten Schreiben sieht es so aus, als hätte sich nichts geändert, aber der Fehler ist verschwunden.

Sugandha Jain
quelle
-1

Wenn ich beim Lesen von Textdateien ein ähnliches Problem habe, verwende ich ...

f = open('file','rt', errors='ignore')
Nocken
quelle