it-swarm.com.de

UnicodeDecodeError: Codec 'utf8' kann das Byte 0xa5 in Position 0: ungültiges Startbyte nicht decodieren

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(​​__get​data())
  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,

​__get​data() Funktion gibt dictionary {} zurück.

Vor dem Posten dieser Frage habe ich this von Frage os SO verwiesen.


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 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.

75
Dipak Ingole

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()
49
Santosh Ghimire

Probieren Sie den folgenden Code-Ausschnitt aus:

with open(path, 'rb') as f:
  text = f.read()
43
Coral

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.

26
JCF

Ich habe dies einfach umgeschaltet, indem ich im Befehl read_csv() ein anderes Codec-Paket definiert habe

encoding = 'unicode_escape'
23
MSalty

Stellen Sie den Standardcodierer oben in Ihrem Code ein

import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")
10
HimalayanCoder

Inspiriert von aaronpenne und Soumyaansh

f    = open("file.txt","rb")
text = f.read().decode(errors='replace')
9
Punnerud

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')
5

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'))
4
aaronpenne

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).

3
Dipak Ingole

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.

1
Sushmita

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.

1
Zuo

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 

0
Priyank Pathak