Ich verwende Python-2.6 CGI
Skripte aber diesen Fehler in Server Log gefunden , während tun json.dumps()
,
Traceback (most recent call last):
File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
print json.dumps(__getdata())
File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte
Hier,
__getdata()
Funktion kehrt zurück dictionary {}
.
Bevor ich diese Frage poste, habe ich diese Frage an SO weitergeleitet.
AKTUALISIERUNG
Die folgende Zeile verletzt den JSON-Encoder.
now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit
Ich habe eine vorübergehende Lösung dafür
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
Aber ich bin mir nicht sicher, ob es richtig ist.
dict
?dict
hatlist, dict, python timestamp value
__getdata
. Ich weiß nicht, warum du einen nicht dekodierbaren Charakter bekommst. Sie können versuchen, Patches für das Diktat zu erstellen, damit es funktioniert, aber diese fragen später meist nur nach weiteren Problemen. Ich würde versuchen, das Diktat auszudrucken, um zu sehen, wo sich das Nicht-ASCII-Zeichen befindet. Finden Sie dann heraus, wie dieses Feld berechnet / gesetzt wurde, und arbeiten Sie von dort aus rückwärts.Antworten:
Der Fehler liegt darin, dass das Wörterbuch ein Nicht-ASCII-Zeichen enthält und nicht codiert / decodiert werden kann. Eine einfache Möglichkeit, diesen Fehler zu vermeiden, besteht darin, solche Zeichenfolgen mit der folgenden
encode()
Funktion zu codieren (wenna
es sich um die Zeichenfolge mit Nicht-ASCII-Zeichen handelt):quelle
Ich habe dies einfach geändert, indem ich im
read_csv()
Befehl ein anderes Codec-Paket definiert habe :encoding = 'unicode_escape'
Z.B:
quelle
pandas
Versuchen Sie das folgende Code-Snippet:
quelle
r
stattrb
. danke für die erinnerung zum hinzufügenb
!open
Funktion 'r' als schreibgeschützten Modus.rb
steht für Read Binary Mode.In Ihrer Zeichenfolge ist ein Nicht-
ascii
Zeichen codiert.utf-8
Wenn Sie andere Codierungen in Ihrem Code verwenden müssen, kann es vorkommen, dass Sie nicht dekodieren können. Beispielsweise:In diesem Fall müssen
windows-1252
Sie Folgendes tun:Jetzt
Unicode
können Sie sicher codierenutf-8
.quelle
Beim Lesen habe
csv
ich eine Codierungsmethode hinzugefügt:quelle
Stellen Sie den Standard-Encoder oben in Ihrem Code ein
quelle
Ab 2018-05 wird dies
decode
zumindest für Python 3 direkt erledigt .Ich verwende das folgende Snippet für
invalid start byte
undinvalid continuation byte
tippe Fehler ein. Das Hinzufügen haterrors='ignore'
es für mich behoben.quelle
Inspiriert von @aaronpenne und @Soumyaansh
quelle
Diese Lösung hat bei mir funktioniert:
quelle
Einfache Lösung:
quelle
Die folgende Zeile verletzt den JSON-Encoder.
Ich habe eine vorübergehende Lösung dafür
Markieren Sie dies als korrekt als vorübergehende Korrektur (nicht sicher).
quelle
Wenn die oben genannten Methoden für Sie nicht funktionieren, sollten Sie die Codierung der CSV-Datei selbst ändern.
Verwenden von Excel:
Notepad verwenden:
Auf diese Weise sollten Sie in der Lage sein, CSV-Dateien zu importieren, ohne auf den UnicodeCodeError zu stoßen.
quelle
Wenn Sie nach dem Ausprobieren aller oben genannten Problemumgehungen immer noch denselben Fehler auslösen, können Sie versuchen, die Datei als CSV zu exportieren (ein zweites Mal, wenn Sie dies bereits getan haben). Insbesondere wenn Sie scikit learn verwenden, ist es am besten, den Datensatz als CSV-Datei zu importieren.
Ich habe Stunden zusammen verbracht, während die Lösung so einfach war. Exportieren Sie die Datei als CSV in das Verzeichnis, in dem Anaconda oder Ihre Klassifizierertools installiert sind, und versuchen Sie es.
quelle
Sie können eine beliebige Standardcodierung für Ihre spezifische Verwendung und Eingabe verwenden.
utf-8
ist die Standardeinstellung.iso8859-1
ist auch in Westeuropa beliebt.z.B:
bytes_obj.decode('iso8859-1')
siehe: docs
quelle
Anstatt nach Möglichkeiten zu suchen, a5 (Yen
¥
) oder 96 (en-dash) zu dekodieren–
) , teilen Sie MySQL mit, dass Ihr Client "latin1" codiert ist, Sie aber "utf8" in der Datenbank haben möchten.Weitere Informationen finden Sie unter Probleme mit UTF-8-Zeichen. Was ich sehe, ist nicht das, was ich gespeichert habe
quelle