2016-06-28 5 views
2

Wie bekomme ich eine Position wo ist UnicodeDecodeError aufgetreten? Ich fand Material über here und versuchte es unten zu implementieren. Aber ich bekomme nur einen Fehler NameError: name 'err' is not definedWie bekomme ich die Position, an der UnicodeDecodeError aufgetreten ist?

Ich suchte bereits im Internet und hier auf StackOverflow, kann aber keinen Hinweis finden, wie man es benutzt. In Python-Dokumenten heißt es, dass diese spezielle Ausnahme ein Start-Attribut hat, also muss es möglich sein.

Vielen Dank.

data = buffer + data 
    try: 
     data = data.decode("utf-8") 
    except UnicodeDecodeError: 
     #identify where did the error occure? 
     #chunk that piece off -> copy troubled piece into buffer and 
     #decode the good one -> then go back, receive the next chunk of 
     #data and concatenate it to the buffer. 

     buffer = err.data[err.start:] 
     data = data[0:err.start] 
     data = data.decode("utf-8") 
+0

Voting nah wie trivial, weil die Antwort ein wesentliches Syntaxdetail ist. Könnte immer noch nützlich sein für zukünftige Referenz. –

Antwort

4

Diese Information wird in der Ausnahme selbst gespeichert. Sie können mit dem as Schlüsselwort, um das Ausnahmeobjekt erhalten, und verwenden Sie das start Attribut:

while True: 
    try: 
     data = data.decode("utf-8") 
    except UnicodeDecodeError as e: 
     data = data[:e.start] + data[e.end:] 
    else: 
     break 
+0

das war einfach. Vielen Dank :) –

+0

In der Dokumentation sagen sie: "Zum Beispiel, err.object [err.start: err.end] gibt die bestimmte ungültige Eingabe, dass der Codec fehlgeschlagen ist." Was bedeutet das: err.object [err.start: err.end] eigentlich? Es ist nicht dasselbe wie e.start., Nicht einmal in der Nähe. –

+1

@ Cooper: Guter Fang! Ich sollte meine Antwort bearbeiten. Eigentlich ist es eng. Das ist ein [slice] (https://docs.python.org/3/reference/expressions.html#slicings). Es bedeutet, alle Zeichen zwischen den Positionen "err.start" und "err.end" zu nehmen. Das beinhaltet "err.start", aber nicht "err.end". In den meisten Fällen ist das Ende nur ein Zeichen nach dem Start, also wird meine Lösung funktionieren. Ich glaube jedoch, dass es Fälle gibt, in denen "err.end" mehr als eine höhere ist. – zondo

0

Falls Sie nur den Fehler ignorieren wollen und den Rest dekodieren, die Sie tun können:

data = data.decode("utf-8", errors='ignore') 
+0

Danke, das werde ich mir merken :) –

Verwandte Themen