解決方案
先直截了當給出解決方案,在程序開頭加上:
import _locale
_locale._getdefaultlocale = (lambda *args: ['zh_CN', 'utf8'])
分析
在Windows下經常用python open函數的人相信都遇到過UnicodeDecodeError: ‘gbk’ codec…這種編碼問題。而且很多有經驗的人應該知道解決方法是加上參數encoding=“utf-8”,因爲"utf-8"是更通用的編碼:
open("test.txt",encoding="utf-8")
然而這樣的解決方法也有一些問題:
- 有多個open的情況下,必須手動一個個添加參數,很麻煩
- 更致命的是,當引用的第三方庫中的open沒有加上這個參數時,我們就幾乎完全束手無策了(勇士可以嘗試修改源碼再重裝)
我正是因爲碰到了第二種情況,於是下定決心找一個一勞永逸的方法解決問題,這就要對原理做一些深入探究。
Python 和 encoding 相關的配置主要有下面幾個:
locale.getpreferredencoding()
這個用的是最廣的。 這是 Python 在 open 文件時默認使用的 encodingsys.getdefaultencoding()
是 Python 進行 str/unicode(byte/str) 轉換時默認使用的 encodingsys.getfilesystemencoding()
是用來 encoding 文件名的, 例如 open(b’balabala’)- 標準輸入輸出(print)的 encoding:
4.1 若設置了PYTHONIOENCODING
環境變量, 則以次變量爲準
4.2 標準輸入輸出是打到終端的話, 看終端的 locale 配置, 在 windows cmd 的代碼頁
4.3 標準輸入輸出被重定向到文件的話, 則參照 1 , 用的是 ` locale.getpreferredencoding()
----出自:http://neue.v2ex.com/t/271999
所以我們的目標是要修改環境配置,python解釋器會取_getdefaultlocale()[1]作爲默認編碼類型。
所以我們採用:
import _locale
_locale._getdefaultlocale = (lambda *args: ['zh_CN', 'utf8'])
重寫函數後,會改變當前運行環境下的所有模塊的默認編碼。
感謝在 https://juejin.im/post/5bd2b6d5e51d45735c3c0453 找到的解決方案