前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从根本解决python3 open的UnicodeDecodeError: 'gbk' codec问题

从根本解决python3 open的UnicodeDecodeError: 'gbk' codec问题

作者头像
blmoistawinde
发布2019-10-30 19:05:39
4.4K0
发布2019-10-30 19:05:39
举报

解决方案

先直截了当给出解决方案,在程序开头加上:

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

分析

在Windows下经常用python open函数的人相信都遇到过UnicodeDecodeError: ‘gbk’ codec…这种编码问题。而且很多有经验的人应该知道解决方法是加上参数encoding=“utf-8”,因为"utf-8"是更通用的编码: open("test.txt",encoding="utf-8")

然而这样的解决方法也有一些问题:

  • 有多个open的情况下,必须手动一个个添加参数,很麻烦
  • 更致命的是,当引用的第三方库中的open没有加上这个参数时,我们就几乎完全束手无策了(勇士可以尝试修改源码再重装)

我正是因为碰到了第二种情况,于是下定决心找一个一劳永逸的方法解决问题,这就要对原理做一些深入探究。

Python 和 encoding 相关的配置主要有下面几个:

  1. locale.getpreferredencoding() 这个用的是最广的。 这是 Python 在 open 文件时默认使用的 encoding
  2. sys.getdefaultencoding() 是 Python 进行 str/unicode(byte/str) 转换时默认使用的 encoding
  3. sys.getfilesystemencoding() 是用来 encoding 文件的, 例如 open(b’balabala’)
  4. 标准输入输出(print)的 encoding: 4.1 若设置了 PYTHONIOENCODING 环境变量, 则以次变量为准 4.2 标准输入输出是打到终端的话, 看终端的 locale 配置, 在 windows cmd 的代码页 4.3 标准输入输出被重定向到文件的话, 则参照 1 , 用的是 ` locale.getpreferredencoding() ----出自:http://neue.v2ex.com/t/271999

所以我们的目标是要修改环境配置,python解释器会取_getdefaultlocale()[1]作为默认编码类型。

所以我们采用:

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

重写函数后,会改变当前运行环境下的所有模块的默认编码。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-02-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决方案
  • 分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档