在計算機中,乙個位元組(byte)有8個位元,即可以表達2^8次方即256個字元,乙個英文本母或符號佔乙個位元組,即ascii碼。ascii碼有意只編了128個。
但是這個表達對於其他語言是不夠用的,特別是東亞文字。於是上世紀**十年代出現了很多並行的編碼表,將2個位元組對應為日文、韓文、簡體或繁體漢字。windows官方使用cp936的編碼表,相當於gb18030. 所以在windows系統裡,不論是文字內容,還是檔名,都是以它來解碼的。
這樣就造成了兩種錯誤,一是如果以ascii碼去讀,會發生錯誤(因為還有128種位元組不被ascii定義),這就逼的程式去指定編碼表。但是依然會發生編碼表錯誤,即錯誤解碼,例如原來是日文的編碼錯解成gb18030就會出錯,形成亂碼。
後來又出現了utf-8,用1-3個位元組將所有的語言的字元都包括進來,1-3個位元組是為了相容ascii,實際可以只用2個位元組,而2個位元組的是unicode,規定記憶體中使用。
這樣,儘管在記憶體中位元組是通用的unicode,但是永久儲存卻有多種編碼,即便都是中文,也有cp936, gb2312, gbk, gb18030和utf-8幾種. 我忘了cp936是對應哪種gb了,但是乙個割裂的後果是微軟體系只要安裝時指定簡體中文,都用cp936,而後來流行的網頁,linux及新興語言,特別是python都預設utf-8.
如上,乙個是在windows系統中執行,如果碰上中文檔名,必須用cp936或gb18030去解碼它。如果你寫了乙個中文的檔名,而python根據utf-8規則去把它翻譯成位元組,就會在底層的檔名上不匹配,因為該中文在cp936的規則下翻譯成另外的位元組。報錯是找不到該檔案。
我參照了很多網上內容,有以下三種解決方法,前兩種類似,是用unicode:
u'中文.xlsx'
r'中文.xlsx'
'中文.xlsx'
.encode(
'cp936'
)
而最後一種直接指定解碼出位元組。最後一種經常是失效的,而前兩種在所有的庫中都可以呼叫,應該是被python底層支援了。
第二個難題是讀取檔案內容時正確指定編碼。如果直接用excel編輯,或者c#之類的外掛程式生成的一般裡面的文字是cp936的,而python的各excel庫偏偏喜歡預設編碼為utf-8
乙個非常簡單粗暴的辦法是在載入了相應庫之後,把excel檔案物件的encoding屬性強行從utf-8更改:
xlrd改檔案內容編碼
xlrd.book.encoding = "gbk"
這樣即使庫沒有提供改編碼介面,也實際改了。當然xlrd還提供了介面。
如果cp936的內容強行用utf-8去解,會發生報錯
unicodedecodeerror: 『utf-8』 codec can』t decode byte 0xce in position 64: invalid continuation byte
xlrd和openpyxl可以同時解決以上兩個問題, 下面是xlrd的一段**。
import xlrd, xlwt
xlrd.book.encoding = "cp936"
exl = xlrd.open_workbook(u'上海**.xlsx')
print("首行為\n ", exl.sheets()[0].row_values(0) )
openpyxl也可以,但是它的語法過於複雜:
# a trial to see if openpyxl works
import openpyxl
openpyxl.workbook.encoding=
"cp936"
book = openpyxl.load_workbook(u'上海**.xlsx'
)print
(book.sheetnames)
sheet = book.active
print
(sheet[
'a1'
].value)
然後直接在cmd視窗進到相應目錄執行它(注意用vscode可能被vscode自己預設的utf-8或工作路徑汙染出錯),兩個難題同時解決了
microsoft windows [版本 6.1.7601]
c:\users\y>d:
d:\>python openpyxl_.py
c:\python37-32\lib\site-packages\openpyxl\styles\stylesheet.py:214: userwarning:
['sheet0']
****
d:\>
python 讀取excel內容為中文的處理
位址1 位址2 位址3 使用python讀取excel內容並把內容寫人檔案時遇到問題 讀取excel的內容,當excel的內容有中文時,輸出為unicode編碼格式,當把資料unicode化後,輸出為亂碼 錯誤資訊 utf8 codec can t decode byte 0xe5 in posit...
python讀取excel檔案
一 安裝xlrd模組 二 使用介紹 1 匯入模組 import xlrd 2 開啟excel檔案讀取資料 data xlrd.open workbook excelfile.xls 3 使用技巧 獲取乙個工作表 table data.sheets 0 通過索引順序獲取 table data.shee...
python讀取Excel例項
1 安裝python官方excel庫 xlrd 2 獲取excel檔案位置並讀取 3 讀取sheet 4 讀取指定rows和cols內容 coding utf 8 import xlrd from datetime import date,datetime def read excel 檔案位置 e...