Python讀取中文Excel問題解決

2021-10-09 11:43:41 字數 2336 閱讀 2032

在計算機中,乙個位元組(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...