2016-08-23 48 views
1

在Windows(32)上使用python 3.5.2,我正在阅读一个DBF文件,它返回一个OrderedDict。当访问OrderedDict的记录时Unicode解码错误

from dbfread import DBF 
Table = DBF('FME.DBF') 
for record in Table: 
    print(record) 

当访问的第一个记录,直到我达到其中包含变音符号记录一切正常:

Traceback (most recent call last): 
    File "getdbe.py", line 3, in <module> 
    for record in Table: 
    File "...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\dbfread\dbf.py", line 311, in _iter_records 
    for field in self.fields] 
    File "...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\dbfread\dbf.py", line 311, in <listcomp> 
    for field in self.fields] 
    File "...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\dbfread\field_parser.py", line 75, in parse 
    return func(field, data) 
    File "...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\dbfread\field_parser.py", line 83, in parseC 
    return decode_text(data.rstrip(b'\0 '), self.encoding) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 11: ordinal not in range(128) 

即使我不打印记录我仍然有问题。

有什么想法?

+0

https://dbfread.readthedocs.io/en/latest/introduction.html#character-encodings,尝试传递'DBF(...)'正确的编码。 –

+0

你确定它是UTF-8编码吗? – Harrison

+0

@哈里森:我非常怀疑它,DBF不是我期望看到UTF-8编码数据的格式。 OP甚至提到UTF-8在哪里? –

回答

0

dbfread未能从您的DBF文件中检测到正确的编码。从Character Encodings section of the documentation

dbfread将尝试通过查看language_driver字节来检测该文件中使用的字符编码(代码页)。 如果失败,它将恢复为ASCII。您可以通过传递encoding='my-encoding'来覆盖它。

强调我的。

你必须通过明确的编码;这将永远是一个Windows代码页。看看supported codecs in Python;您必须使用一个以cp开头的文字。如果你不知道什么代码页,你会有一些试验和错误的工作要做。请注意,某些代码页的字符重叠,因此即使代码页看起来产生可读的结果,您也可能希望继续搜索并尝试数据文件中的不同记录以查看最适合的代码。

+0

这是正确的答案。我有问题找到正确的编码,所以我看到了第一个遇到的变音符号,即**“é”**并搜索了哪个编码符合** x82 **,我发现它是cp850(MS-DOS)。 –

+0

@SDufour:有[11个代码页,其中'é'编码为0x82](http://www.fileformat.info/info/unicode/char/e9/codepage_support.htm)。你可以用更多的代码点进一步缩小范围。 –

+0

谢谢,我没有时间看它。 –