2013-08-23 10 views
5

が、私はこれが持っている "0xc3" のバイトをデコードすることはできません 'UTF8' コーデックUnicodeDecodeError:パイソン2.7では

with open("abc.txt", 'r', encoding='utf-8') as f: 
    f.read() 

取得するのみ:

File "C:\Python32\lib\codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 633096: invalid continuation byte 

は私が間違って何をしましたか?メモ帳++は、文書がUnicode utf-8であることを示しているようです。私がメモ帳でこの形式に文書を変換しようとすると+ +私はまだPython 3でこのエラーが発生します。これは、他の多くのutf-8でエンコードされた文書を何も問題なく読んでいるので奇妙です。

+0

その位置の周囲の文字について「od」とは何ですか? –

答えて

3

あなたの入力はĂとして0xC3を含むISO-8859-2としてエンコードされていると思います。入力ファイルのエンコーディングを確認してください。

+0

メモ帳++は、文書がBOMなしでUTF8としてエンコードされていると言います。 – Baz

+8

@Bazメモ帳++は間違っていると推測できます。エンコーディングを推測するための信頼できる方法はありません。すべてのプログラムが間違ったエンコーディングを推測することがあるので、常にファイルのエンコーディングを知る必要があります。エンコーディングをutf-8に明示的にするファイルを書き直してみてください(例えば、 'open'の代わりに' codecs.open'を使うなど)。 – Bakuriu

2

あなたのPython 2.7が例外をスローしないという事実に基づいて、私はi.words()が一連のバイト列を返すと推測します。これらはUTF8でエンコードされる可能性は低いです - おそらくLatin-1かそのようなものでしょうか。その後、それらをファイルに書き込みます。この時点でエンコードは行われません。

これをUnicode文字列に変換する必要があります。既存のエンコーディングを知っている必要があります。ファイルを書き込むときにUTF-8としてエンコードする必要があります。例えば

# -*- coding: utf-8 -*- 
from nltk.corpus import abc 
import codecs 
with codecs.open("abc.txt","w","utf-8") as f: 
    f.write(u" ".join(codecs.decode(word,"latin-1") for word in i.words())) 

さらにいくつかのノートには、ケース内の任意の混乱があります:

  • -*- coding: utf-8 -*-ラインは、Pythonスクリプト自体を記述するために使用されるエンコーディングを指します。そのスクリプトの入力または出力には影響しません。
  • Python 2.7には、2種類の文字列があります。バイト列は、指定されていないエンコーディングのバイトシーケンスで、ユニコード文字列は、ユニコードコードポイントのシーケンスです。バイトストリングが最も一般的で、通常の​​文字列リテラル構文を使用すると得られるものです。 Unicode文字列は、u"abc"構文を使用するときに得られるものです。
  • Python 2.7では、open関数を使用してファイルを開き、バイトストリングを書き込むだけでエンコードは行われません。バイトストリングのバイトは、ファイルに直接書き込まれます。 Unicode文字列を書き込もうとすると、デフォルト(ASCII)コーデックでエンコードできない文字が含まれていると例外が発生します。