1. 程式人生 > >你覺得python很難,那只是你沒有懂而已!

你覺得python很難,那只是你沒有懂而已!

你覺得python很難,那只是你沒有懂而已!

在 Python 尤其是 Python2 中,編碼問題是困擾開發者尤其初學者的一大問題。什麼 Unicode/UTF-8/str,又是 decode/encode 的,搞得人頭都大了。其實不然,看似龐大難懂,但是可以非常精細地定製需求。

0.Python 中的編碼

Python 中有兩個常用的由 basestring 派生出來的表示字串的型別:str, unicode。其中,str 類似於 C 中的字元陣列或者 Java 中的 byte 陣列,事實上你可以將它理解為一個儲存二進位制內容的容器,str 不儲存編碼資訊,果對 str 型別的字串迭代的話,則會按照其在記憶體中的位元組序依次迭代,意味著如果這個字串儲存的是多位元組字元(Unicode/GBK等),則會截斷這個字元,演示如下:

你覺得python很難,那只是你沒有懂而已!

而對於 unicode 型別,Python 在記憶體中儲存和使用的時候是按照 UTF-8 格式,在程式碼中的表示為字串前加 u,如:

你覺得python很難,那只是你沒有懂而已!

而 unicode 與 str 之間的轉換,則用到了 encode 和 deocde 方法。decode 表示將一個 (str) 字串按照給定的編碼解析為 unicode 型別,encode 則表示將一個 unicode 字串按照指定編碼解析為位元組陣列 (str):

你覺得python很難,那只是你沒有懂而已!

1.檔案讀寫

你覺得python很難,那只是你沒有懂而已!

內建的 open 函式開啟檔案時,read 方法讀取的是一個 str (私以為叫做位元組陣列更合適),如果讀取的是其它編碼的文字,則需要 decode 之後再做使用。

你覺得python很難,那只是你沒有懂而已!

對於使用 open 函式開啟檔案之後的寫操作,則需要將需要寫入的字串按照其編碼 encode 為一個 str ,如果直接寫入,則會引發如下錯誤:

你覺得python很難,那只是你沒有懂而已!

除此以外,codecs 模組也提供了一個 open 函式,可以直接指定好編碼開啟一個文字檔案,那麼讀取到的檔案內容則直接是一個 unicode 字串。對應的指定編碼後的寫入檔案,則可以直接將 unicode 寫到檔案中。通過 codecs.open 可以避免很多編碼問題:

你覺得python很難,那只是你沒有懂而已!

你覺得python很難,那只是你沒有懂而已!

建議

對於 Python 程式碼中避免遇到編碼問題,有一些小建議:

  • 字元編碼宣告:在程式碼開頭宣告編碼格式

  • 使用 codecs 的 open 函式處理文字檔案

  • 儘可能使用 unicode 而不是 str

  • 為你準備的Python學習交流群: 629440234,海量學習資料,每晚8.05分固定分享Python直播學習,歡迎你的加入。 裙內有開發工具,很多幹貨和技術資料分享