test

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。所以,主要弄清楚數據在輸入輸出階段的情況:

  1. 數據是字節還是字符。字節通過解碼變成字符,字符通過編碼編程字節。

  2. 輸入前數據是什么編碼格式,所采用的方法使用什么解碼方式,保證方法能夠正確解碼。

  3. 輸出時需要什么樣的編碼格式,所采用的方法使用什么編碼方式,保證能正確編碼。

舉例:

  1. 解碼錯誤

一般要讀的文件都是以某種方式編碼的字節,如utf-8,我們要弄清楚我們讀文件的方法(如open)采用什么方式進行解碼,如果不是utf-8,則會出現UnicodeDecodeError錯誤。

  1. 編碼錯誤

如果輸入的數據是unicode字符,但其中包含非ASCII字符,就不能采用ASCII編碼方法進行編碼。如果用了,就會出現UnicodeEncodeError錯誤。應該采用utf-8等方式編碼

總之,出現編解碼錯誤的本質就是上面描述的內容,只要找到的發生問題的點,然后弄這個點做了什么,一切編解碼問題就迎刃而解。

編解碼問題涉及到一些背景知識,看這篇文章前建議先去了解一下。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容