Python入门第10篇(编码)

目录

一、编码是什么?

二、Python中编码

1.读取文件引发的问题

2.其实是Windows的问题

3.试着改改问题

4.各种骚操作

5.终极解决

6.推荐方案

总结

Python系列文章目录


前言

编码存在于所有文件,比较常见的ASCII、utf8、gbk等。最常用的还是utf8编码。

在编码领域,也会涉及到代码文件,那么也会涉及编码问题,今天就这一问题进行介绍。

一、编码是什么?

编码就是特定字符的集合,是用于显示特点的字符。比如ASCII只能显示256个字符,utf8则可以表示各种符号多种语言的文字,具有更好的包容性。

二、Python中编码

1.读取文件引发的问题

一般读取文件内容,我们这么写代码就可以了

with open("./.env", "r",encoding="utf-8") as f:print(f.read())

如上代码,是直接读取环境变量文件,并且设置了编码为utf8,这里如果编码不匹配,就会报错:

UnicodeDecodeError: 'gbk' codec can't decode byte 0x95 in position 8: illegal multibyte sequence

因为读取文件内容的时候,有些中文在不同编码格式下编码信息是不一样的,就会导致报错。

由于一般用的都是utf8编码,那我们平时都用utf8编码,这种出错的情况也会很少。

但是随着Python开发接触的越来越多,你一定会用到很多其他的包,这个时候可能就会出意外了。比如某个包提供一个读取配置文件的方法,你感觉应该没问题,结果执行的时候就报错了,然后翻到包里的代码去看,结果,我的天,它咋不设置编码格式!!!

with open(str(template_file), "r") as f:template = f.read()

一开始我就直接把人家包的代码给改了,加了encoding参数,问题暂时是解决了,但是会后患无穷,包不得更新,一个更新又出问题了,你如果都忘了这事,那真是神不知鬼不觉的。 

2.其实是Windows的问题

经过一系列了解,原来这个问题主要出在Windows系统。自从Python3开始,Python的默认编码就是utf8了,这个在Linux、Mac系统下都没问题的。唯独在Windows下有问题,简单说在Windows下Python获取当前编码,还和操作系统编码、区域啥的有关系了

3.试着改改问题

读取文件其实是一个解码的过程,根据提示通过gbk无法解码某个字符,说明当前读取文件用的是gbk编码,但是gbk解码出错,说明读取的文件编码不是gbk,看了下文件编码确实不是gbk,而是utf8。为啥会这样,一会我们说。我们先看咋解决

结合如上分析,一个办法就是我们把文件编码也改为gbk,应该就可以了呗。改了果然可以。

就当我以为要大功告成的时候,突然想起来,Linux一直没这种编码问题的,于是决定用相同代码和相同的文件(修改编码为gbk)在Linux环境测试。

哇咔咔,果断报错。UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte

通过上面的分析经验,我们知道Linux默认是用的utf8解码,但是我们的文件却改为了gbk编码,那不报错才怪呢

看来,我这个改法是不行的,不能Windows改好了,结果Linux废了。

还得找路子


这里顺便说下Windows下为啥文件编码默认就是utf8,但是默认解码却是gbk。

文件是我们新建的,和Python本身是没关系的,而文件新建其实我们一般在开发环境下操作,比如我用的就是VSCode,这些开发工具其实默认编码已经设置为了utf8,这也就是为啥文件编码默认是utf8的原因。

而解码是要Python代码来实现,而默认解码同样是Python底层控制的,开发环境在python底层之上,是无法反向干预的。而默认解码在Windows下和操作系统编码、区域(或根据操作系统语言匹配一个编码,gbk就是我们国家的编码)相关的。


4.各种骚操作

问题没解决,只能各种问AI、问度娘了

1)设置PYTHONIOENCODING环境变量————————————没卵用

2)locale.setlocale(locale.LC_ALL, ".UTF-8")——————————没卵用

3)_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])——没卵用

default_encoding = locale.getpreferredencoding()
print("当前环境的默认编码是:", default_encoding)

如上代码可以查看当前环境的默认编码,但是经过如上设置,这个默认编码还是cp936,其实就是gbk,cp936是Windows操作系统内部编码叫法,可见很大概率和操作系统有关系

4)sys.setdefaultencoding('utf-8')——————————————没卵用,还报错

这玩意其实是Python2中才有的,Python3默认编码就是utf8,这玩意取消了,所以在搜索信息的时候还要明确是Python3

5)指定sys.flags.utf8_mode————————————————没卵用,还报错

sys.flags.utf8_mode是只读属性无法设置

5.终极解决

好奇会害死猫

好奇也会让我都不想去吃饭,不想出去遛弯,只为找到真理

终于找到两个个靠谱的

1)设置环境变量PYTHONUTF8=1

测试no problem。

2)重写open,从而给open加了encoding参数

original_open = __builtins__.open
def uopen(*args, **kwargs):if "b" not in (args[1] if len(args) >= 2 else kwargs.get("mode", "")):kwargs.setdefault("encoding", "UTF-8")return original_open(*args, **kwargs)
__builtins__.open = uopen 如上代码干啥用的,使用了python的哪些技术点

测试同样ok

附上参考链接:1. 命令行和环境 — Python 3.12.3 文档icon-default.png?t=N7T8https://docs.python.org/3/using/cmdline.html#envvar-PYTHONUTF8

3)命令行运行增加-X utf8参数

运行py命令:python xx.py,注意是在python和xx.py之间增加

完整命令:python -X utf8 xx.py

 测试可用,不过仅限于命令窗口,PyCharm中可以设置运行的时候增加这个脚本,不过我用的CSCode,参考链接:Python open 默认编码修改_python open utf8-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/linuxweiyh/article/details/124538216

6.推荐方案

如上5.终极解决,有几个方案可选,但是从通用性考虑,还是通过改环境变量的方式最省事。

其他办法要不不通用,要不需要修改的代码比较多,比如重写open,涉及问题的代码文件都得加这个代码。

改环境变量就没这个问题,反正Linux默认就是utf8,Windows和Linux、Mac统一了也没啥问题。

总结

通过一个小小的编码,引出一个Windows操作系统下Python编码的问题,网上相关资料很多,但是真正解决问题的资料却偏少,是不是多数Python开发用Linux、Mac操作系统。

不管如何,总算解决问题了。


Python系列文章目录

Python入门第01篇(Python安装与开发工具)-CSDN博客

Python入门第02篇(pip、字符串、方法、json、io操作)_python json pip-CSDN博客

Python入门第03篇(异常处理、dotenv)_load_dotenv()-CSDN博客

Python入门第04篇(sqlite数据库相关)_cmd中使用sqlite-CSDN博客

Python入门第05篇(爬虫相关)-CSDN博客

Python入门第06篇(FastApi、uvicorn)_fastapi uvicorn-CSDN博客

Python入门第09篇(conda虚拟环境)-CSDN博客

Flask开发webapi初步及过程问题探究_flask webapi-CSDN博客

Linux下docker运行python_linux docker运行python-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型 AI 框架昇思 MindSpore 2.3.RC1 发布,训练、推理性能大幅提升,JIT 编译强化

经过社区开发者们几个月的开发与贡献,现正式发布昇思 MindSpore2.3.RC1 版本,通过多维混合并行以及确定性 CKPT 来实现超大集群的高性能训练,支持大模型训推一体架构,大模型开发训练推理更简、更稳、更高效,并在训推一…

【产品设计】B端产品权限设计~功能权限设计篇

对于B端设计而言,良好的权限设计架构是支持其复杂业务的基础和关键。 一、什么是权限管理 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源。 简而言之,用户登录系统后&#xff0…

使用 Redux 管理全局状态

Redux 是个状态集中管理框架,状态可以跨组件共享,状态更新后,调用监听器。其实状态可以认为就是个全局对象,为什么要做一个框架来管理呢?如果我们自己使用一个全解字典来管理状态是不是也行?如果不做任何控…

想在游泳健身的同时畅听音乐,随时哈氪漫游这款IP68防水的骨传导耳机

平时健身的过程中,音乐是许多健身爱好者的忠实伴侣。无论是在室内的健身房,还是户外的自然风光中,一副优质的耳机可以极大地提升我们的锻炼体验。现在市面上专为运动设计的耳机选择非常多,我喜欢用骨传导耳机,目前在用…

深入理解多线程编程

title: 深入理解多线程编程 date: 2024/4/25 17:32:02 updated: 2024/4/25 17:32:02 categories: 后端开发 tags:线程同步互斥锁死锁避免竞态条件线程池异步编程性能优化 第一章:多线程基础 1.1 线程概念与原理 线程:在操作系统中,一个程序…

ADB常用命令

大家好,今天给大家分享一些ADB的常用命令,我们作为测试了解ADB命令能给我们带来哪些好处呢? 1、ADB 命令可以帮助测试人员与Android设备进行交互,如安装、卸载应用,获取设备信息等,便于更深入地测试设备功能…

世强硬创获昕感科技授权代理,SiC MOSFET实现超低导通电阻

近日,世强先进(深圳)科技股份有限公司(下称“世强先进”)获北京昕感科技有限责任公司(下称“昕感科技”,英文名:NEXIC)授权代理,为光伏、储能、电网、新能源汽…

C# 给图片添加文字水印

目录 应用场景 开发运行环境 方法说明 方法代码 调用示例 小结 应用场景 在某些应用项目(如电子档案信息管理)中,查看电子图片信息是经常使用到的功能,此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。…

Golang对接Ldap(保姆级教程:概念搭建实战)

Golang对接Ldap(保姆级教程:概念&搭建&实战) 最近项目需要对接客户的LDAP服务,于是趁机好好了解了一下。LDAP实际是一个协议,对应的实现,大家可以理解为一个轻量级数据库。用户查询。比如&#xff…

力扣HOT100 - 114. 二叉树展开为链表

解题思路&#xff1a; class Solution {List<TreeNode> list new ArrayList<>();public void flatten(TreeNode root) {recur(root);for (int i 1; i < list.size(); i) {TreeNode pre list.get(i - 1);TreeNode cur list.get(i);pre.left null;pre.right…

使用Shell终端访问Linux

一、实验目的 1、熟悉Linux文件系统访问命令&#xff1b; 2、熟悉常用 Linux Shell的命令&#xff1b; 3、熟悉在Linux文件系统中vi编辑器的使用&#xff1b; 4、进一步熟悉虚拟机网络连接模式与参数配置&#xff01; 二、实验内容 1、使用root帐号登陆到Linux的X-windows…

【Qt 学习笔记】Qt常用控件 | 输入类控件 | Combo Box的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 输入类控件 | Combo Box的使用及说明 文章编号&#xff…

【Qt 学习笔记】Qt常用控件 | 显示类控件 | LCD Number的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件 | LCD Number的使用及说明 文章编号&#xf…

wps屏幕录制怎么用?分享使用方法!

数字化时代&#xff0c;屏幕录制已成为我们学习、工作和娱乐中不可或缺的一部分。无论是制作教学视频、分享游戏过程&#xff0c;还是录制网络会议&#xff0c;屏幕录制都能帮助我们轻松实现。WPS作为一款功能强大的办公软件&#xff0c;其屏幕录制功能也备受用户青睐。本文将详…

代码随想录:二叉树15-17

目录 404.左叶子之和 题目 代码&#xff08;后序递归&#xff09; 代码&#xff08;前序迭代&#xff09; 513.找树左下角的值 题目 代码&#xff08;层序迭代&#xff09; 112.路径总和 题目 代码&#xff08;前序迭代&#xff09; 112.路径总和II 题目 代码&…

Linux读写文件

前言 学习了文件系统&#xff0c;就能理解为什么说Linux下一切皆文件。 语言层面的操作 在c语言的学习中我们可以使用fopen()函数对文件进行操作。 int main() {//FILE * fp fopen("./log.txt", "w");//FILE * fp fopen("./log.txt", "…

TablePlus for Mac/Win:开启高效数据开发新纪元

在当今数字化时代&#xff0c;数据的重要性日益凸显。无论是企业还是个人&#xff0c;都需要一款强大而实用的本地原生数据开发软件来提升工作效率。而 TablePlus for Mac/Win 正是这样一款卓越的工具&#xff0c;它为用户带来了全新的体验&#xff0c;让数据开发变得更加轻松、…

第1次作业

目录 重点内容提要一、误差度量二、浮点数系统三、误差传播四、数值稳定性 作业解析 重点内容提要 一、误差度量 二、浮点数系统 三、误差传播 四、数值稳定性 作业解析

快速部署 Garnet

快速部署 Garnet Garnet 是 Microsoft Research 推出的一种新型远程缓存存储&#xff0c;其设计速度极快、可扩展且延迟低。 Garnet 在单个节点内是线程可扩展的。它还支持分片集群执行、复制、检查点、故障转移和事务。它可以在主内存以及分层存储&#xff08;例如 SSD 和 Az…

GRASSHOPPER电池Expression

Grasshopper中如果要实现简单的条件if语句的效果&#xff0c;可以使用电池Expression。 举例&#xff1a;获取两个数的差值&#xff0c;永远用大数减去小数