2013-08-23 12 views
5

In Python 2.7 Ich habe dies:UnicodeDecodeError: 'utf8' Codec Byte nicht dekodieren kann "0xC3"

# -*- coding: utf-8 -*- 
from nltk.corpus import abc 
with open("abc.txt","w") as f: 
    f.write(" ".join(i.words())) 

ich dann versuchen, in diesem Dokument in Python zu lesen 3:

with open("abc.txt", 'r', encoding='utf-8') as f: 
    f.read() 

nur zu erhalten:

File "C:\Python32\lib\codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 633096: invalid continuation byte 

Was ich falsch gemacht habe? Notepad ++ scheint anzuzeigen, dass das Dokument Unicode utf-8 ist. Selbst wenn ich versuche, das Dokument in dieses Format mit Notepad ++ zu konvertieren, bekomme ich diesen Fehler in Python 3, was seltsam ist, da ich viele andere utf-8-codierte Dokumente ohne Probleme lese.

+0

Was sagt 'od' über die Charaktere um diese Position? –

Antwort

3

Meine Vermutung ist, dass Ihre Eingabe als ISO-8859-2 codiert ist, die Ă als 0xC3 enthält. Überprüfen Sie die Codierung Ihrer Eingabedatei.

+0

Notepad ++ sagt, dass das Dokument als UTF8 ohne BOM – Baz

+8

geschrieben wurde @Baz Notepad ++ kann falsch raten. Es gibt keine zuverlässige Methode, eine Codierung zu erraten. Jedes Programm wird manchmal die falsche Kodierung erraten, deshalb sollten Sie die Kodierung einer Datei immer * kennen *. Versuchen Sie, die Datei neu zu schreiben, indem Sie die Codierung auf utf-8 explizit setzen (z. B. mit 'codecs.open' anstelle von' open'). – Bakuriu

2

Basierend auf der Tatsache, dass Ihr Stück von Python 2.7 keine Ausnahme auslöst, würde ich schließen, dass i.words() eine Sequenz von Bytestrings zurückgibt. Diese werden wahrscheinlich nicht in UTF8 kodiert sein - ich würde vielleicht Latin-1 oder so etwas vermuten. Sie schreiben sie dann in die Datei. Zu diesem Zeitpunkt findet keine Codierung statt.

Sie müssen diese wahrscheinlich in Unicode-Zeichenfolgen konvertieren, für die Sie ihre vorhandene Codierung kennen müssen, und dann müssen Sie diese beim Schreiben der Datei als UTF-8 kodieren.

Zum Beispiel:

# -*- coding: utf-8 -*- 
from nltk.corpus import abc 
import codecs 
with codecs.open("abc.txt","w","utf-8") as f: 
    f.write(u" ".join(codecs.decode(word,"latin-1") for word in i.words())) 

Einige weitere Hinweise, falls es irgendeine Verwirrung:

  • Die -*- coding: utf-8 -*- Linie bezieht sich auf die Codierung verwendet, um den Python-Skript selbst zu schreiben. Es hat keine Auswirkung auf die Eingabe oder Ausgabe dieses Skripts.
  • In Python 2.7 gibt es zwei Arten von Strings: Bytestrings, die Sequenzen von Bytes mit einer nicht angegebenen Codierung sind, und Unicode-Strings, die Sequenzen von Unicode-Codepunkten sind. Bytestrings sind am häufigsten und sind, was Sie erhalten, wenn Sie die reguläre "abc" String-Literal-Syntax verwenden. Unicode-Zeichenfolgen erhalten Sie, wenn Sie die Syntax u"abc" verwenden.
  • Wenn Sie in Python 2.7 nur die Funktion open verwenden, um eine Datei zu öffnen und Bytestrings darauf zu schreiben, findet keine Codierung statt. Die Bytes des Bytestring werden direkt in die Datei geschrieben. Wenn Sie versuchen, Unicode-Strings zu schreiben, erhalten Sie eine Ausnahme, wenn sie Zeichen enthalten, die nicht vom Standardcodec (ASCII) codiert werden können.
Verwandte Themen