2014-07-07 7 views
11

Ich muss eine Textdatei in Python lesen. Die Datei-Codierung ist:UnicodeDecodeError in Python beim Lesen einer Datei, wie man den Fehler ignoriert und zur nächsten Zeile springt?

file -bi test.csv 
text/plain; charset=us-ascii 

Dies ist eine Drittanbieter-Datei, und ich bekomme einen neuen jeden Tag, so dass ich lieber nicht ändern. Die Datei hat nicht-ASCII-Zeichen, wie z. B. Ö. Ich muss die Zeilen mit Python lesen, und ich kann es mir leisten, eine Zeile zu ignorieren, die ein nicht-ASCII-Zeichen hat.

Mein Problem ist, dass, wenn ich die Datei in Python lese, bekomme ich die UnicodeDecodeError beim Erreichen der Zeile, wo ein Nicht-ASCII-Zeichen existiert, und ich kann den Rest der Datei nicht lesen.

Gibt es eine Möglichkeit, dies zu vermeiden. Wenn ich das versuchen:

fileHandle = codecs.open("test.csv", encoding='utf-8'); 
try: 
    for line in companiesFile: 
     print(line, end=""); 
except UnicodeDecodeError: 
    pass; 

dann, wenn der Fehler die Enden für Schleife erreicht und ich kann die restlichen der Datei nicht lesen. Ich möchte die Zeile überspringen, die den Fehler verursacht und weitermachen. Ich würde, wenn möglich, lieber keine Änderungen an der Eingabedatei vornehmen.

Gibt es eine Möglichkeit, dies zu tun? Vielen Dank.

+0

Warum verwenden Sie 'codecs.open()' in Python 3? 'open()' behandelt UTF-8 ** einfach in Ordnung **. –

+0

Ich habe auch versucht, mit offenen, bekomme ich den gleichen Fehler – Chicoscience

+0

Wissen Sie, welche Kodierung die Datei wirklich verwendet? Es ist eindeutig nicht "us-ascii", wie es durch die Ausgabe "file" gezeigt wird, da es nicht-ASCII-Zeichen enthält. – dano

Antwort

24

Ihre Datei scheint nicht die UTF-8-Codierung zu verwenden. Es ist wichtig, beim Öffnen einer Datei den richtigen Codec zu verwenden.

Sie könnenopen() sagen, wie Dekodierungsfehler zu behandeln, mit dem errors Stichwort:

Fehler ist ein optionaler String, der angibt, wie die Codierung und Decodierung Fehler gehandhabt-diese werden nicht verwendet werden im binären Modus. Eine Vielzahl von Standard-Fehlerhandlern ist verfügbar, obwohl jeder Fehlerbehandlungsname, der unter codecs.register_error() registriert wurde, ebenfalls gültig ist. Die Standardnamen sind:

  • 'strict' eine ValueError Ausnahme zu erhöhen, wenn es ein Codierungsfehler ist. Der Standardwert None hat denselben Effekt.
  • 'ignore' ignoriert Fehler. Beachten Sie, dass das Ignorieren von Codierungsfehlern zu Datenverlust führen kann.
  • 'replace' bewirkt, dass ein Ersatzmarker (z. B. "?") Eingefügt wird, wenn fehlerhafte Daten vorhanden sind.
  • 'surrogateescape' werden alle inkorrekten Bytes als Codepunkte im Unicode Private Use-Bereich von U + DC80 bis U + DCFF darstellen. Diese privaten Codepunkte werden dann in dieselben Bytes zurückverwandelt, wenn der surrogateescape Fehlerhandler beim Schreiben von Daten verwendet wird. Dies ist nützlich für die Verarbeitung von Dateien in einer unbekannten Kodierung.
  • 'xmlcharrefreplace' wird nur beim Schreiben in eine Datei unterstützt. Zeichen, die nicht von der Codierung unterstützt werden, werden durch die entsprechende XML-Zeichenreferenz &#nnn; ersetzt.
  • 'backslashreplace' (wird auch nur beim Schreiben unterstützt) ersetzt nicht unterstützte Zeichen durch von Python rückgängig gemachte Escape-Sequenzen.

Öffnen der Datei mit 'ignore' oder 'replace' können Sie dann die Datei, ohne Ausnahmen angehoben lesen.

+0

Ich versuchte, eine alternative Lösung zu finden, indem ich die Dekodierungsausnahmen selbst abfing. Unglücklicherweise scheint es (zumindest in Python 2), dass die Dekodierung stattfindet * bevor * Zeilenenden erkannt werden, so dass Sie keine konsistenten Ergebnisse erhalten - Sie könnten mehr als eine Zeile verlieren, oder Sie könnten für immer am selben Puffer hängen. –

+0

Dies funktioniert NICHT in Python 2.x. –

+1

@AndrejGajduk: Nein, tut es nicht und es war nie beabsichtigt. Die Frage bezieht sich auf Python 3. In Python 2 können Sie jedoch 'io.open()' verwenden (was im Grunde die gleiche Funktion ist). –

Verwandte Themen