2011-10-24 41 views
1

我有一個法語字典文件,我從WinEdt.org (Zip File)得到。我想讀取該文件到內存,但是當我做我的錯誤:閱讀Python中的.dic文件

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

我使用codecs模塊與編碼utf-8也嘗試過,但是,這並不工作,要麼:

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

當你說 「不工作,要麼」,你是什麼意思?你能顯示打開文件的實際代碼嗎? – Amber

+1

顯示一些代碼,所以我們可以知道問題出在哪裏... –

+2

嘗試使用'latin-1'作爲編碼,因爲'0xe2'不是有效的utf8和'print'\ xe2'.decode('latin-1')。 '給'' – mouad

回答

4

latin1又名ISO-8859-1是「一個網羅和妄想」。latin1「works」解碼隨機二進制亂碼,因爲latin1編解碼器將所有256個字節映射到Unicode碼位。

在這種情況下,給出信息(1)法語(2)「WinEdt.org」(你好,你好,這是「贏」,如在「Windows」)。該文件很可能在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愛沙尼亞,拉脫維亞和立陶宛
cp1258越南語

+0

用拉丁文1解碼文本似乎給了可識別的法語單詞。 cp1252也是如此。爲什麼我使用哪一個? –

+0

@AlexBliskovsky:如果您使用'latin1',則包含「LATIN SMALL LIGATURE OE」的單詞將被填滿。對於其他語言,如果使用ISO-8859-m而不是相應的cp125n,後果將會更糟糕。現在就進入正確的習慣。 –

+0

@AlexBliskovsky:...像œil(「eye」)和œuf(「egg」)這樣的常見詞 –