星期一, 7月 25, 2011

Python 2 與 3 之字串與檔案

Python 3 裡,很多常用的 package 名稱都變更了,這個倒還好,在 python 2.x 的文件裡,都已經可以看到說 3 的時候,名稱會是什麼,以及要注意什麼,甚至也有 2to3 的工具來輔助轉換。

最近遇到比較麻煩的是字串與檔案的處理,Python 3 裡的字串都是以 unicode 處理,好處當然是不用轉來轉去了,比較麻煩就是讀取檔案跟寫檔案的時候。我的程式有同時用到 subprocess、urllib/urllib2與一般檔案操作,以下是整理:
  1. 進行 subprocess pipe 操作時,讀出時,都是 bytes
  2. 使用 urllib/urllib2 讀取時,都是 bytes
  3. 使用一般檔案操作,沒特別指定的話,檔案編碼會以你當前的環境編碼來讀取,預定是讀取文字檔。

所以在讀取時,為了後續能用一樣的邏輯來讀取,我統一以 binary 來讀取,避掉 encoding 問題(對於 python 3 在 binary mode時,也能正確分行、tokenize這件事上,真的是深感佩服)。是說剛好之後也不需要做精確的內容判斷,所以也不用硬轉成 string(unicode),在 python3 時,都以 bytes 存在。在 python 2,讀出來就都是一般的 string (無 unicode),不是 bytes。

寫入時,也儘量使用 bytes 去寫入,避免encoding轉來轉去的問題。

沒有留言: