2009-06-19 16 views
0

初めてしばらくのPythonをやって、と私はトラブル私は、Python 3.0.1で以下のスクリプトを実行し、ファイルの簡単なスキャンを行うことを抱えているが、UnicodeDecodeError読み辞書の単語は簡単なPythonスクリプトでファイルとき

with open("/usr/share/dict/words", 'r') as f: 
    for line in f: 
     pass 

私はこの例外を取得:

Traceback (most recent call last): 
    File "/home/matt/install/test.py", line 2, in <module> 
    for line in f: 
    File "/home/matt/install/root/lib/python3.0/io.py", line 1744, in __next__ 
    line = self.readline() 
    File "/home/matt/install/root/lib/python3.0/io.py", line 1817, in readline 
    while self._read_chunk(): 
    File "/home/matt/install/root/lib/python3.0/io.py", line 1565, in _read_chunk 
    self._set_decoded_chars(self._decoder.decode(input_chunk, eof)) 
    File "/home/matt/install/root/lib/python3.0/io.py", line 1299, in decode 
    output = self.decoder.decode(input, final=final) 
    File "/home/matt/install/root/lib/python3.0/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 1689-1692: invalid data 

それは上に吹くファイルの行は、どのような方法では珍しいように思わない、「アルゼンチン」です。

更新:私は、オープン()の呼び出しに

encoding="iso-8559-1" 

を追加し、それが問題を修正しました。

+0

は、あなたが 'ISO-8859-1'を意味するものではなかったことを確認していますか?それははるかに一般的なようです。さらに、\ xf3はAsunciónのiso-8859(そしてUnicodeではコードポイントU + 00F3です)では「ó」ですが、UTF-8では '\ xc3 \ xb3'と表示されます。 – Malvolio

+0

@Malvolio:符号化名を間違って入力した可能性があります;-) –

答えて

1

「位置1689-1692」からファイルのどの行が爆発したかはどのようにして判断しましたか?これらの数字は、デコードしようとしているチャンク内のオフセットです。あなたはそれがどんな塊であったかを判断しなければならなかっただろう - どのように?

対話プロンプトでこれを試してみてください。

buf = open('the_file', 'rb').read() 
len(buf) 
ubuf = buf.decode('utf8') 
# splat ... but it will give you the byte offset into the file 
buf[offset-50:60] # should show you where/what the problem is 
# By the way, from the error message, looks like a bad 
# FOUR-byte UTF-8 character ... interesting 
+0

私はそれをループして出力しました。例外がスローされたときに最後に出力された行。あなたが提案したことを試してみたところ、別の場所で爆破されているようです。buf [9881-20:9881 + 20] = b "as \ nAsturias's \ nAsunci \ xf3n \ nAsunci \ xf3n's \ nAswan \実際には "Asunción"に面白いキャラクターがあります。 –

+0

(1)9881-1689 == 8192 == chunk-sizeの倍数(2)DIDはiconv実験で確認されたファイルオフセット9881で爆発します。 (3)例外が発生したときにstdoutがフラッシュされることを保証していないので、あなたはアルゼンチンを見た(4)のは面白いことでもなく面白いことでもない。 encoding = "iso-8559-1"を指定して "non-ASCII"(5)のような中立の用語を試してみてください。あなたが正しいエンコーディングであることを100%確信している場合にのみ問題を解決します - エンコーディングは256の8ビットコード暗号化されたランダムなバイトの古い実行可能ファイルまたはファイルは、「正常に」デコードされます。 –

+0

技術的なご意見ありがとうございました。 (私は中立的な用語を試していますが、おそらくあなたは少し明るくすることができますか?結局のところ、これはコーディングのウェブサイトであり、国際的な外交ではありません。) –

1

有効なUTF-8であることを確認できますか?それを行う方法はthis SO questionで与えられる:

iconv -f UTF-8 /usr/share/dict/words -o /dev/null 

同じことを行うために他の方法があります。

+0

「iconv:9881位の入力シーケンスが正しくありません」 –

関連する問題