Python读取中文Excel问题解决
Python讀取中文Excel問題解決
- 為什么讀取中文Excel會出錯
 - 兩個難題
 - 試驗結果
 
為什么讀取中文Excel會出錯
在計算機中,一個字節(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還提供了接口。
 如果cp936的內容強行用utf-8去解,會發生報錯
試驗結果
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) 2009 Microsoft Corporation。保留所有權利。C:\Users\Y>d:D:\>python openpyxl_.py C:\Python37-32\lib\site-packages\openpyxl\styles\stylesheet.py:214: UserWarning:Workbook contains no default style, apply openpyxl's defaultwarn("Workbook contains no default style, apply openpyxl's default") ['Sheet0'] 證券代碼D:\>下一篇會講寫excel。我看到通用的視頻是講xlwt或openpyxl,其實這兩個都不實用。這些培訓真是誤人子弟。具體如何,下期再見。
總結
以上是生活随笔為你收集整理的Python读取中文Excel问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: CTS测试中testYuvBurst[1
 - 下一篇: android算法实现房贷计算器