2016-06-28 11 views
2

UnicodeDecodeErrorはどこで発生しましたか? here以上の素材を見つけ、それを以下で実装しようとしました。しかし、私はちょうどエラーを取得しますNameError: name 'err' is not definedUnicodeDecodeErrorが発生した位置を取得する方法は?

私はすでにインターネット上でStackOverflowを検索しましたが、それをどのように使うかのヒントは見つかりません。 Pythonのドキュメントでは、この特定の例外には開始属性があるため、可能でなければなりません。

ありがとうございます。

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

投票はに答えは不可欠な構文の詳細です。将来の参考に役立つかもしれません。 –

答えて

4

この情報は例外自体に格納されます。あなたはasキーワードで例外オブジェクトを取得し、start属性を使用することができます。

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

は簡単でした。ありがとうございます:) –

+0

彼らは言う文書: "たとえば、err.object [err.start:err.end]は、コーデックが失敗した特定の無効な入力を示します。これは何ですか:err.object [err.start:err.end]は実際にはどういう意味ですか?それはe.startと同じではなく、近くでさえありません。 –

+1

@クーパー:良いキャッチ!私は私の答えを編集する必要があります。実際、それは近いです。これは[スライス](https://docs.python.org/3/reference/expressions.html#slicings)です。 'err.start'と' err.end'の位置の間ですべての文字を取ることを意味します。それには 'err.start'が含まれますが、' err.end'は含まれません。ほとんどの場合、終了は開始後1文字に過ぎないので、私の解決策はうまくいきます。しかし、「err.end」が2つ以上高い場合があると私は信じている。 – zondo

0

あなただけのエラーを無視して、残りをデコードしたい場合は、あなたが行うことができます:

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

ありがとう、私は心に留めておく:) –

関連する問題