解决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编码报错的噩梦所纠缠。接口

相关文章
相关标签/搜索