2011-05-20 42 views
0

這是我的代碼:如何處理使用日語單詞蟒蛇xlrd

#!/usr/bin/python 
#-*-coding:utf-8-*- 

import xlrd,sys,re 

data = xlrd.open_workbook('a.xls',encoding_override="utf-8") 
a = data.sheets()[0] 
s='' 
for i in range(a.nrows): 
    if 9<i<20: 
     #stage 
     print a.row_values(i)[1].decode('shift_jis')+'\n' 

但它顯示:

???? 
???????? 
?????? 
???? 
???? 
???? 
???????? 

所以我可以做什麼,

感謝

+1

它看起來像你正在閱讀文件爲UTF-8,然後試圖解釋爲什麼Shift JIS?我不希望這樣工作! – 2011-05-20 08:52:10

回答

2

背景:在「現代」(Excel 97-2003)XLS文件中,文本有效地存儲爲Unicode。在較舊的文件中,文本以8位字符串存儲,並且「代碼頁」記錄告訴它如何編碼,例如整數1252對應於稱爲cp1252windows-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對象。顯示它們,需要編碼不能解碼)他們從unicodestr使用合適的編碼。令人驚訝的是,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

0

爲什麼你的編碼不​​能在開啓shift-jis上重寫?

data = xlrd.open_workbook('a.xls',encoding_override="shift-jis") 

如果文件是真的轉向-JIS,有大量的代碼點(也坦率地說,幾乎所有的人)不具有合法的UTF-8代碼點重疊。如果你得到非法字符(?),你的文件實際上是UTF-8,並且你想輸出Shift-JIS,那麼我可能會建議你的輸出shell(用於打印 - 可能是一個文件會很好)不能處理編碼。