Python的編解碼問題
對于使用Python來做數據科學的我,第一個遇到的困難就是Python2的編解碼錯誤。由于項目上比較急,一直沒有時間深入探索,只能先改用Python3解決。實際上,如果不弄清楚問題的本質,在Python3中還會出現另一些編解碼問題。近期有時間,將這個問題好好地進行了梳理。
問題1:用python2.x運行的程序文件中有中文就出錯
程序文件名chinese.py
print my_chinese
1
2
在終端輸入命令python chinese.py,會出現如下錯誤提示:
錯誤提示
原因:
python是一種先編譯后解釋的語言,它在執行python xxx.py時,需要先對程序文件進行編譯。編譯器首先要讀取文件,這時如果沒有聲明文件編碼方式,編譯器會使用默認的ASCII來對字節進行解碼。這時,如果文件中包含非ASCII字符編碼的字節,就會報錯。
解決方案:
在程序文件chinese.py的第一行或第二行加入#coding:utf-8。其實,如果懂正則表達式的話,其實符合coding[:=]\s*([-\w.]+)都可以。
問題2:unicode編碼解碼錯誤
UnicodeEncodeError:
UnicodeEncodeError
UnicodeDecodeError:
UnicodeDecodeError
原因:
這個問題主要發生在程序的輸入輸出階段,由自動的隱式轉換造成。
輸出前的數據是字符,需要把它編碼為字節。如果沒有對其以正確的方式編碼,就會出現UnicodeEncodeError
輸入前的數據是字節,需要把它解碼為字符。如果沒有對其以正確的方式解碼,就會出現UnicodeDecodeError
對字節進行編碼操作會產生UnicodeDecodeError;對字符進行解碼操作會產生UnicodeEncodeError
解決方案:
輸入之前和輸出之后數據都是字節的形式,中間都是unicode。所以,主要弄清楚數據在輸入輸出階段的情況:
數據是字節還是字符。字節通過解碼變成字符,字符通過編碼編程字節。
輸入前數據是什么編碼格式,所采用的方法使用什么解碼方式,保證方法能夠正確解碼。
輸出時需要什么樣的編碼格式,所采用的方法使用什么編碼方式,保證能正確編碼。
舉例:
- 解碼錯誤
一般要讀的文件都是以某種方式編碼的字節,如utf-8,我們要弄清楚我們讀文件的方法(如open)采用什么方式進行解碼,如果不是utf-8,則會出現UnicodeDecodeError錯誤。
- 編碼錯誤
如果輸入的數據是unicode字符,但其中包含非ASCII字符,就不能采用ASCII編碼方法進行編碼。如果用了,就會出現UnicodeEncodeError錯誤。應該采用utf-8等方式編碼
總之,出現編解碼錯誤的本質就是上面描述的內容,只要找到的發生問題的點,然后弄這個點做了什么,一切編解碼問題就迎刃而解。
編解碼問題涉及到一些背景知識,看這篇文章前建議先去了解一下。