Ich verwende Python-2.6 CGI
-Skripts, habe diesen Fehler jedoch im Serverprotokoll gefunden, während ich json.dumps()
durchführte.
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 gibt dictionary {}
zurück.
Vor dem Posten dieser Frage habe ich this von Frage os SO verwiesen.
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 einen temporären Fix dafür bekommen
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
Aber ich bin nicht sicher, ob es richtig ist.
Der Fehler liegt darin, dass das Wörterbuch einige Zeichen enthält, die keine ASCII-Zeichen sind, und es kann nicht codiert/decodiert werden. Eine einfache Möglichkeit, diesen Fehler zu vermeiden, besteht darin, solche Zeichenfolgen mit der Funktion encode()
wie folgt zu codieren (wenn a
die Zeichenfolge mit Nicht-ASCII-Zeichen ist):
a.encode('utf-8').strip()
Probieren Sie den folgenden Code-Ausschnitt aus:
with open(path, 'rb') as f: text = f.read()
Ihre Zeichenfolge enthält ein Nicht-ASCII-Zeichen.
Wenn Sie mit utf-8 nicht decodieren können, müssen Sie möglicherweise andere Codierungen in Ihrem Code verwenden. Zum Beispiel:
>>> 'my weird character \x96'.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 19: invalid start byte
In diesem Fall lautet die Kodierung Windows-1252, daher müssen Sie Folgendes tun:
>>> 'my weird character \x96'.decode('windows-1252')
u'my weird character \u2013'
Nun, da Sie über Unicode verfügen, können Sie sicher in utf-8 kodieren.
Ich habe dies einfach umgeschaltet, indem ich im Befehl read_csv()
ein anderes Codec-Paket definiert habe
encoding = 'unicode_escape'
Stellen Sie den Standardcodierer oben in Ihrem Code ein
import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")
Inspiriert von aaronpenne und Soumyaansh
f = open("file.txt","rb")
text = f.read().decode(errors='replace')
Beim Lesen von CSV habe ich eine Codierungsmethode hinzugefügt
import pandas as pd
dataset = pd.read_csv('sample_data.csv',header=0,encoding = 'unicode_escape')
Ab 2018-05 wird dies direkt mit decode
behandelt, zumindest für Python 3 .
Ich verwende das folgende Snippet, nachdem ich invalid start byte
- und invalid continuation byte
-Typfehler erhalten habe. Das Hinzufügen von errors='ignore'
hat es für mich behoben.
with open(out_file, 'rb') as f:
for line in f:
print(line.decode(errors='ignore'))
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 einen temporären Fix dafür bekommen
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
Markieren Sie dies als temporäres Update (nicht sicher).
Wenn Sie alle zuvor genannten Problemumgehungen ausprobiert haben, können Sie, wenn immer noch derselbe Fehler auftritt, die Datei als CSV-Datei exportieren (ein zweites Mal, wenn Sie es bereits getan haben) .. _. Insbesondere wenn Sie scikit learn verwenden, empfiehlt sich der Import der Datensatz als CSV-Datei.
Ich verbrachte Stunden zusammen, während die Lösung so einfach war. Exportieren Sie die Datei als CSV-Datei in das Verzeichnis, in dem Anaconda oder Ihre Klassifizierungstools installiert sind, und versuchen Sie es.
Wenn die oben genannten Methoden nicht für Sie funktionieren, sollten Sie die Kodierung der CSV-Datei selbst ändern.
Excel verwenden:
1. Open csv file using Excel
2. Navigate to "File menu" option and click "Save As"
3. Click "Browse" to select a location to save the file
4. Enter intended filename
5. Select CSV (Comma delimited) (*.csv) option
6. Click "Tools" drop-down box and click "Web Options"
7. Under "Encoding" tab, select the option Unicode (UTF-8) from "Save this document as" drop-down list
8. Save the file
Notepad verwenden:
1. Open csv file using notepad
2. Navigate to "File" > "Save As" option
3. Next, select the location to the file
4. Select the Save as type option as All Files(*.*)
5. Specify the file name with .csv extension
6. From "Encoding" drop-down list, select UTF-8 option.
7. Click Save to save the file
Auf diese Weise sollten Sie in der Lage sein, CSV-Dateien zu importieren, ohne auf UnicodeCodeError zu stoßen.
Allgemein gesagt,
Python gibt einen solchen Fehler aus, wenn versucht wird, einen unzulässigen Objekttyp als Datei zu lesen.
z.B.
file = open("xyz.pkl", "r")
text= file.read()
die zweite Zeile wirft den obigen Fehler aus:
UnicodeDecodeError: 'utf-8' Codec kann das Byte 0x80 in Position 0 nicht decodieren: ungültiges Startbyte
Ein ähnliches Lesen von .npy in ähnlicher Weise führt ebenfalls zu dieser Art von Fehler