從根本解決python3 open的UnicodeDecodeError: 'gbk' codec問題

解決方案

先直截了當給出解決方案,在程序開頭加上:

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 相關的配置主要有下面幾個:

  1. locale.getpreferredencoding() 這個用的是最廣的。 這是 Python 在 open 文件時默認使用的 encoding
  2. sys.getdefaultencoding() 是 Python 進行 str/unicode(byte/str) 轉換時默認使用的 encoding
  3. sys.getfilesystemencoding() 是用來 encoding 文件的, 例如 open(b’balabala’)
  4. 標準輸入輸出(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 找到的解決方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章