2016-08-23 63 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

謝謝,我沒有時間看它。 –