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,一经查实,立即删除!

相关文章

java8 最简单的将字符串写入文本的方式

文章目录 简要说明maven依赖样例代码 简要说明 java8 最简单的将字符串写入文本,并指定编码格式 maven依赖 无样例代码 try {// 使用Java 8的NIO包写入文件,并指定编码为 fileCharsetPath path Paths.get(destPath);Files.write(path, "your St…

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

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

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

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

使用 Redux 管理全局状态

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

【ARMv9 DSU-120 系列 9.1 -- ROM tables】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 DSU-120 ROM tablesDebug system address map核心 <n> ROM表集群ELA核心ELA组件调试APB系统地址映射:DSU-120 ROM tables DSU-120(DynamIQ™共享单元-120)具有三种不同类型的ROM表。这些ROM表根据ARM CoreSi…

OceanBase 分布式数据库【信创/国产化】- OceanBase Demo 环境搭建

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase Demo 环境搭建前言OceanBase 数据更新架构部署背景信息组件介绍部署前提条件下载并安装 all-in-one 安装包单机部署 OceanBase 数据库执行输出中的连接命令连接数据库配置 OceanBase 密码Ocea…

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

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

C语言经典例题-11

1.序列中整数去重 题目描述: 输入n个整数的序列&#xff0c;要求对这个序列进行去重操作。所谓去重&#xff0c;是指对这个序列中每个重复出现的整数&#xff0c;只保留该数第一次出现的位置&#xff0c;删除其余位置。 输入描述: 输入包含两行&#xff0c;第一行包含一个正…

深入理解多线程编程

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

K8s: 最佳实践经验之谈

最佳实践 1 &#xff09;普通配置 定义配置时&#xff0c;请指定最新的稳定 API 版本在推送到集群之前&#xff0c;配置文件应存储在版本控制中 这允许您在必要时快速回滚配置更改它还有助于集群重新创建和恢复 使用 YAML 而不是 JSON 编写配置文件 虽然这些格式几乎可以在所有…

ADB常用命令

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

大数据——Zookeeper安装、启动、操作命令(一)

Zookeeper 概述 Zookeeper本身是Apache提供的一套开源的用于进行分布式管理和协调的机制/框架。官网&#xff1a;https://zookeeper.apache.orgZookeeper本身提供了中心化服务&#xff0c;包含统一配置、统一命名、分布式锁服务、分布式组服务&#xff0c;更多的时候&#xf…

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

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

耀斑层-如何在Unity中实现耀斑亮光效果

在Unity中实现耀斑亮光效果可以通过以下步骤来实现&#xff1a; 创建一个空物体作为光源&#xff1a;在场景中创建一个空物体&#xff0c;并将其放置在需要发出耀斑亮光效果的位置上。 添加光源组件&#xff1a;选中空物体&#xff0c;在Inspector面板中点击"Add Compone…

leetcode152 乘积最大子数组

给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续 子数组 &#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。 示例 1: 输入: nums [2,3,-2,4] 输出: 6 解释: 子数组 …

C# 给图片添加文字水印

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

石家庄学院2023年大学生程序设计大赛题解

A、大臣的旅费 floyd求最短路径 #include <iostream>using namespace std;int d[1005][1005]; int n; int res;int f(int x) {// 等差数列return ((11 x 10) * x) / 2; }void init() {for (int i 1; i < n; i) {for (int j 1; j < n; j) {if (i j) d[i][j] …

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

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

各种类型游戏的乐趣与魅力

游戏已经成为人们生活中不可或缺的一部分。从家庭娱乐到专业电竞&#xff0c;游戏行业呈现出多姿多彩的景象&#xff0c;吸引着亿万玩家的目光。而游戏的多样性正是其中一大魅力所在。让我们一起探索各种类型游戏的乐趣与魅力吧&#xff01; 动作游戏&#xff1a; 动作游戏以快…

力扣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…