2011-10-24 8 views
1

私はWinEdt.org (Zip File)から得たフランス語の辞書ファイルを持っています。私はメモリにこのファイルを読みたいが、私が行うとき、私はエラーを取得する:Pythonで.dicファイルを読む

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in 
    position 69: ordinal not in range(128) 

私もエンコーディングutf-8codecsモジュールを使用して試してみたが、それは動作しません。次のいずれか

with codecs.open(self.template_folder_path + "/" + self.test_language + ".txt", 
        'rb', encoding='utf-8') as fp: 
     word_list = [] 

     for line in fp: 
      word_list.append(line.strip()) 

     self.words[self.test_language] = word_list 

どうすればこのファイルを読むことができますか?また、そのウェブサイトからいくつかの辞書ファイルを読み込む必要があります。それについてどうすればいいですか?

+2

ベトナム語ラトビアとリトアニア
cp1258あなたが言う "動作しないのどちらか"、あなたは何を意味しています?ファイルを開いている実際のコードを表示できますか? – Amber

+1

はいくつかのコードを表示するので、どこに問題があるのか​​わかります... –

+2

'0xe2'は有効なutf8ではないので、' latin-1'をエンコーディングとして使ってみてください。 'print '\ xe2'.decode(' latin-1 ') 'give'â'... – mouad

答えて

4

latin1別名ISO-8859-1は「スネアと妄想」です。latin1コーデックは、すべての256バイトをUnicodeコードポイントにマップするため、latin1でランダムなバイナリのぎこちないコードを "デコード"します。

この場合、情報(1)フランス語(2)「WinEdt.org」(こんにちは、「Windows」のように「Win」です)。そのファイルはcp1252にエンコードされている可能性があります。

>>> guff = open('fr.dic', 'rb').read() 
>>> z = guff.decode('latin1') 
>>> sum((128 <= ord(c) < 160) for c in z) # count the C1 control characters 
141 
>>> aliens = set(c for c in z if 128 <= ord(c) < 160) 
>>> aliens 
set([u'\x9c']) 
>>> from unicodedata import name 
>>> name(u'\x9c') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: no such name 
>>> name('\x9c'.decode('cp1252')) 
'LATIN SMALL LIGATURE OE' 

QED 

更新:そのウェブサイトの他のファイルについて尋ねました。まず、辞書に関連付けられた.TXTファイルを読む(サイトが推奨するように)。たとえば、大規模なロシア語辞書の.TXTファイルには、「辞書は標準のWindowsロシア語コードページ(1251)を前提としています」と記載されています。このリストから最も適切なものを試してみてください:

cp1250東ヨーロッパのラテン系スクリプトポーランド語、チェコ語、セルビア語(ラテン語のスクリプト)
cp1251キリル文字ベースのスクリプト。ロシア語、ウクライナ語、セルビア語(キリル文字)
cp1252西ヨーロッパ系ラテン系スクリプトドイツ語、フランス語
cp1253ギリシャ
cp1254トルコ
cp1255はヘブライ語
cp1256アラビア
cp1257エストニア語、

+0

latin-1でテキストをデコードすると、認識可能なフランス語が表示されるようです。 cp1252も同様です。私はどちらを使うのがなぜ重要ですか? –

+0

@AlexBliskovsky: 'latin1'を使うと、" LATIN SMALL LIGATURE OE "を含む単語が詰まってしまいます。他の言語では、適切なcp125nではなくISO-8859-mを使用すると、その結果はさらに悪化します。今すぐ正しい習慣に入りましょう。 –

+0

@AlexBliskovsky:... il(「目」)とœuf(「卵」)のような一般的な言葉 –