在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
经过运行脚本是添加命令行参数 -X utf8(注意是跟在python.exe后面的interpreter option,不是跟在要运行脚本后面的parameters!)命令行
指定sys.flags.utf8_mode参数以后,Python运行时会在不少场景下自动使用utf-8编码,而不是win默认的gbk(cp936)编码。code
import _locale
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])
复制代码
python解释器会取_getdefaultlocale()[1]做为默认编码类型,重写后,会改变当前运行环境下的全部模块的默认编码。orm
总之,使用以上两种方法后,windows平台下,open()函数会默认用utf-8编码打开文件,其实不止open()方法,跨模块、全局改变python解释器的默认编码为utf-8,会带来不少使用上的便利,而不须要被gbk编码报错的噩梦所纠缠。接口