在Python中读取.dic文件
我有一个法语词典文件,是从 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:越南语