解决Python在windows平台默认编码(encoding)为gbk所导致的open()函数报错及其他编码问题...

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

在windows平台下使用python内置函数 open() 时发现,当不传递encoding参数时,会自动采用gbk(cp936)编码打开文件,而当下很大部分文件的编码都是UTF-8。

我们当然可以通过每次手动传参encoding='utf-8',但是略显冗余,而且有很多外国的第三方包,里面调用的内置open()函数并没有提供接口让我们指定encoding,这就会导致这些包在windows平台上使用时,常会出现如 "UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 209: illegal multibyte sequence" 的报错

通过查看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运行时的“默认编码类型”。

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

通过运行脚本是添加命令行参数 -X utf8(注意是跟在python.exe后面的interpreter option,不是跟在要运行脚本后面的parameters!)

指定sys.flags.utf8_mode参数之后,Python运行时会在很多场景下自动使用utf-8编码,而不是win默认的gbk(cp936)编码。

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

import _locale
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])
复制代码

python解释器会取_getdefaultlocale()[1]作为默认编码类型,重写后,会改变当前运行环境下的所有模块的默认编码。

总之,使用以上两种方法后,windows平台下,open()函数会默认用utf-8编码打开文件,其实不止open()方法,跨模块、全局改变python解释器的默认编码为utf-8,会带来很多使用上的便利,而不需要被gbk编码报错的噩梦所纠缠。

转载于:https://juejin.im/post/5bd2b6d5e51d45735c3c0453

你可能感兴趣的:(解决Python在windows平台默认编码(encoding)为gbk所导致的open()函数报错及其他编码问题...)