在Python中读取.dic文件

1 投票
1 回答
4026 浏览
提问于 2025-04-17 04:54

我有一个法语词典文件,是从 WinEdt.org 下载的,链接在这里 (压缩文件)。我想把这个文件读到内存里,但每次尝试时都会出现错误:

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

我该怎么读取这个文件呢?我还想从那个网站读取其他几个词典文件,我该怎么做呢?

1 个回答

4

latin1,也叫ISO-8859-1,是个“陷阱和错觉”。latin1来解码随机的二进制乱码“有效”,因为latin1编码可以把所有256个字节都映射到一个Unicode字符上。

在这个情况下,考虑到信息(1)法语(2)“WinEdt.org”(嘿嘿,就是“Win”像“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:越南语

撰写回答