2016-08-01 12 views
2

Ich versuche, eine Textdatei zu laden, die mitPython lesen Nicht-ASCII-Textdatei

content=open("file.txt","r").read() 

einige deutsche Buchstaben enthält, die in dieser Fehlermeldung führt

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 26: ordinal not in range(128) 

, wenn ich die Datei ändern Um nur ASCII-Zeichen zu enthalten, funktioniert alles wie erwartet.

Apperently

content=open("file.txt","rb").read() 

oder

content=open("file.txt","r",encoding="utf-8").read() 

beides mit dem Job.

Warum ist es möglich, mit "binary" -Modus zu lesen und das gleiche Ergebnis wie mit utf-8-Codierung zu erhalten?

Antwort

3

ASCII ist auf Zeichen im Bereich von [0,128] beschränkt. Wenn Sie versuchen, ein Byte zu dekodieren, das außerhalb dieses Bereichs liegt, wird dieser Fehler angezeigt.

Wenn Sie die Zeichenfolge als Byte einlesen, erweitern Sie den zulässigen Zeichenbereich auf [0,256]. So wird Ihr \ 0xc3-Zeichen à jetzt fehlerfrei eingelesen. Aber obwohl es zu funktionieren scheint, ist es immer noch nicht "korrekt".

Wenn Ihre Strings tatsächlich Unicode-codiert sind, besteht die Möglichkeit, dass ein Multibyte-Zeichen enthalten ist, dh ein Zeichen, dessen Byte-Repräsentation tatsächlich mehrere Bytes umfasst.

In diesem Fall ist der Unterschied zwischen dem Lesen einer Datei als Byte-String und der richtigen Dekodierung offensichtlich.

Ein Charakter wie folgt aus: è

Wird in zwei Bytes gelesen werden, aber richtig decodiert wird, wird ein Zeichen sein:

bytes = bytes('č', encoding='utf-8') 

print(len(bytes))     # 2 
print(len(bytes.decode('utf-8'))) # 1 
5

In Python 3 verwendet der Modus 'r' und keine Kodierung, verwendet nur eine Standardkodierung, in diesem Fall ASCII. Im Modus 'rb' wird die Datei als Byte gelesen und es wird nicht versucht, sie als Zeichenkette zu interpretieren.

+0

Ok, ich sehe 'Typ (open (ULF_DIR +" Banken. txt "," rb "). read())' returns "Bytes" und 'type (open (ULF_DIR +" Banken.txt "," r ", encoding =" utf-8 "). read())' returns str . Ich schrieb die Ausgabe in eine andere Datei und war verwirrt, weil die resultierende Datei auf beiden Methoden gleich aussah und ich die verschiedenen Typen nach der Eingabe der Daten ignorierte. –