在Windows(32)上使用python 3.5.2,我正在读取一个返回OrderedDict的DBF文件。
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 :(得分:0)
dbfread
无法从您的DBF文件中检测到正确的编码。来自Character Encodings section of the documentation:
dbfread
将尝试通过查看language_driver
字节来检测文件中使用的字符编码(代码页)。 如果失败,则恢复为ASCII 。您可以通过传递encoding='my-encoding'
来覆盖此内容。
强调我的。
您必须传递明确的编码;这将永远是一个Windows代码页。看看supported codecs in Python;你必须在这里使用以cp
开头的那个。如果您不知道代码页是什么,那么您将有一些反复试验的工作要做。请注意,某些代码页在字符中会重叠,因此即使代码页看起来会产生清晰的结果,您也可能希望继续搜索并尝试在数据文件中查找不同的记录以查看最适合的内容。