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

本文介绍在Windows环境下,Python内置open()函数默认使用gbk编码的问题及解决方案。通过设置sys.flags.utf8_mode或重写_locale._getdefaultlocale,可使Python默认使用utf-8编码,避免编码错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意 以下提到的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值