2016-08-23 2 views
1

с использованием python 3.5.2 на windows (32), я читаю DBF-файл, который возвращает мне OrderedDict.python Ошибка декодирования Unicode при доступе к записям OrderedDict

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. Где ОП даже упоминает UTF-8? –

ответ

0

dbfread не удалось обнаружить правильную кодировку из файла DBF. Из Character Encodings section of the documentation:

dbfread будет пытаться определить кодировку (код страницы), используемый в файле, глядя на language_driver байт. Если это не удается, оно возвращается к ASCII. Вы можете отменить это, пройдя encoding='my-encoding'.

Emphasis mine.

Вам нужно будет передать явное кодирование; это будет всегда кодовая страница 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

Спасибо, я не успел посмотреть на это. –