背景:在「現代」(Excel 97-2003)XLS文件中,文本有效地存儲爲Unicode。在較舊的文件中,文本以8位字符串存儲,並且「代碼頁」記錄告訴它如何編碼,例如整數1252對應於稱爲cp1252
或windows-1252
的編碼。無論哪種情況,xlrd
都會將提取的文本顯示爲unicode對象。
請插入此行到您的代碼:
print data.biff_version, data.codepage, data.encoding
如果你有一個新的文件,你會看到
80 1200 utf_16_le
在任何情況下,請編輯你的問題彙報結果。
問題1:需要encoding_override
只有當文件是舊文件並且您知道/懷疑代碼頁記錄被省略或錯誤時。如果文件是新文件,則忽略它。你真的知道這個文件是Excel-97之前的文本,並且文本是用UTF-8編碼的嗎?如果是這樣,它只能由一些嚴重欺騙的第三方軟件創建,並且如果您嘗試使用Excel打開它,Excel將炸燬;用棒球棒訪問作者。否則,請不要使用encoding_override。
問題2:你應該有unicode
對象。顯示它們,需要編碼(不能解碼)他們從unicode
到str
使用合適的編碼。令人驚訝的是,print unicode_object.decode('shift-jis')
不會引發異常並打印出問號。
爲了幫助理解這一點,請改變你的代碼是這樣的:
text = a.rowvalues(i)[1]
print i, repr(text)
print repr(text.decode('shift-jis'))
,並報告結果。
因此,我們可以幫助您選擇適當的編碼(如果有的話),告訴我們您正在使用,什麼下面顯示的是什麼操作系統是什麼版本:
print sys.stdout.encoding
import locale
print locale.getpreferredencoding()
延伸閱讀:
(1)xlrd文檔(關於Unicode的部分,正面朝上)...包含在發行版中,或者獲取最新的提交here。 (3)Python Unicode HOWTO。
它看起來像你正在閱讀文件爲UTF-8,然後試圖解釋爲什麼Shift JIS?我不希望這樣工作! – 2011-05-20 08:52:10