解決Python在windows平臺默認編碼(encoding)爲gbk所致使的open()函數報錯及其餘編碼問題

注意 如下提到的Python均指的Python3.7

在windows平臺下使用python內置函數 open() 時發現,當不傳遞encoding參數時,會自動採用gbk(cp936)編碼打開文件,而當下很大部分文件的編碼都是UTF-8。python

咱們固然能夠經過每次手動傳參encoding='utf-8',可是略顯冗餘,並且有不少外國的第三方包,裏面調用的內置open()函數並無提供接口讓咱們指定encoding,這就會致使這些包在windows平臺上使用時,常會出現如 "UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 209: illegal multibyte sequence" 的報錯windows

經過查看python文檔分析緣由:函數

if encoding is not specified the encoding used is platform dependent: locale.getpreferredencoding(False) is called to get the current locale encoding. (For reading and writing raw bytes use binary mode and leave encoding unspecified.)編碼

能夠發現當open不傳遞encoding參數時,是默認調用locale.getpreferredencoding()方法來獲取當前平臺的「默認編碼類型」,繼續查看相關文檔,發現有兩種方法能夠指定windows平臺下Python運行時的「默認編碼類型」。spa

1. 指定sys.flags.utf8_mode(推薦)

經過運行腳本是添加命令行參數 -X utf8(注意是跟在python.exe後面的interpreter option,不是跟在要運行腳本後面的parameters!)命令行

指定sys.flags.utf8_mode參數以後,Python運行時會在不少場景下自動使用utf-8編碼,而不是win默認的gbk(cp936)編碼。code

2. 直接重寫_locale(兼容老版本)

import _locale
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])
複製代碼

python解釋器會取_getdefaultlocale()[1]做爲默認編碼類型,重寫後,會改變當前運行環境下的全部模塊的默認編碼。orm

總之,使用以上兩種方法後,windows平臺下,open()函數會默認用utf-8編碼打開文件,其實不止open()方法,跨模塊、全局改變python解釋器的默認編碼爲utf-8,會帶來不少使用上的便利,而不須要被gbk編碼報錯的噩夢所糾纏。接口

相關文章
相關標籤/搜索