2010-12-29 14 views
3
File "/usr/lib/python3.1/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 805: invalid start byte 

Hallo, ich bekomme diese Ausnahme. Wie erfasse ich es und lese weiter meine Dateien, wenn ich diese Ausnahme bekomme.Außer Python-Codec-Fehler?

Mein Programm hat eine Schleife, die eine Textdatei Zeile für Zeile liest und versucht, etwas zu verarbeiten. Einige Dateien, auf die ich stoße, sind jedoch möglicherweise keine Textdateien oder Zeilen, die nicht korrekt formatiert sind (Fremdsprache usw.). Ich möchte diese Zeilen ignorieren.

Das Folgende ist nicht

for line in sys.stdin: 
    if line != "": 
     try: 
     matched = re.match(searchstuff, line, re.IGNORECASE) 
     print (matched) 
     except UnicodeDecodeError, UnicodeEncodeError: 
     continue 
+0

Es gibt ein ganzes ** KAPITEL ** im Python-Tutorial * dediziert * für Fehler und Ausnahmen. Probieren Sie es aus. http://docs.python.org/tutorial/errors.html –

+0

Ja, ich verstehe es. Ich frage nicht, ob Python Funktionen im Zusammenhang mit Fehlern und Ausnahmen hat. Ich benutze try, außer Anweisungen, aber diese Codec-Decodierfehler werden nicht ausgenommen, was zu fehlgeschlagenen Jobs führt. – Deepak

+0

Bitte posten Sie kurzen, aber nicht editierten Code. Sind die ** buchstäblich in deinem Code? – phihag

Antwort

6

Blick auf http://docs.python.org/py3k/library/codecs.html arbeiten. Wenn Sie den Codecs Stream öffnen, möchten Sie wahrscheinlich das zusätzliche Argument 3 errors='ignore'

In Python verwenden, sys.stdin ist standardmäßig als Text-Stream geöffnet (siehe http://docs.python.org/py3k/library/sys.html) und hat Prüfung strenge Fehler.

Sie müssen es als fehlertoleranter UTF-8-Stream erneut öffnen. So etwas wird funktionieren:

sys.stdin = codecs.getreader('utf8')(sys.stdin.detach(), errors='ignore') 
+1

Er läuft 3.1, also nicht * ganz * das. –

+0

@Ignacio guter Punkt, aber die Antwort ist die gleiche - Ich habe den Link zu den py3k docs behoben. –

+1

Nicht ... ganz. 'codecs.open()' wird in 3.x nicht wirklich benötigt, da seine Fähigkeiten jetzt ein Teil von 'open()' sind. –