Python中编码(encode)解码(decode)讲解

news2024/11/16 11:30:37

嗨害大家好鸭!我是小熊猫~

这次也是给大家带来一点干货~

请添加图片描述

所用素材:点击此处跳转文末名片获取


一、python3中str与unicode

在python3中,字符串有两种形式:str和bytes,两者区别如下:

unicode string(str类型):以Unicode code points形式存储(人认识的形式)

byte string(bytes类型):以byte形式存储(机器认识的形式)

在python3中所定义的所有字符串都是unicode string类型,

使用type和isinstance可以判别

请添加图片描述

而bytes是一个二进制序列对象,

你只要你在定义字符串时前面加一个b,

就表示你要定义一个bytes类型的字符串对象

请添加图片描述
但是在定义中文字符串时,

你就不能直接在前面加b了,

而应该使用encode转一下

请添加图片描述
请添加图片描述
请添加图片描述

二、python2中str与unicode

而在Python2中,
字符串的类型又与Python3不一样, 需要仔细区分

在Python2里,字符串也只有两种类型,unicode和str

只有unicode object和非unicode object(其实应该叫str object)的区别:

unicode string(unicode类型):以Unicode code points形式存储(人认识的形式)

byte string(str类型):以byte形式存储(机器认识的形式)

当我们直接使用双引号或单引号包含字符的方式来定义字符串时,

就是str字符串对象,比如这样

请添加图片描述
而当我们在双引号或单引号前面加个u,

就表明我们定义的是unicode字符串对象,比如这样

请添加图片描述

请添加图片描述

请添加图片描述

三、如何检测对象的编码

所有的字符,在unicode字符集中都有对应的编码值(code point)

而把这些编码值按照一定的规则保存成二进制字节码,
就是我们说的编码方式,常见的有:UTF-8,GB2312等。

也就是说,当我们要将内存中的字符串持久化到硬盘中的时候,
都要指定编码方法,
而反过来,读取的时候,
也要指定正确的编码方法(这个过程叫解码),
不然会出现乱码。

那问题就来了,当我们知道了其对应的编码方法,
我们就可以正常解码,
但并不是所有时候我们都能知道应该用什么编码方式去解码?

这时候就要介绍到一个python的库–chardet,
使用它之前需要先安装

python3 -m pip install chardet

chardet有一个detect方法,可以预测其编码格式

import chardet

chardet.detect(encode(‘gbk’))

{‘encoding’: ‘GB2312’,‘confidence’: 0.99,‘language’: ‘Chinese’}

为什么说是预测呢,通过上面的输出来看,
你会看到有一个confidence字段,其表示预测的可信度,
或者说成功率。

但是使用它时,若你的字符数较少,就有可能“误诊”),
比如只有中文两个字,就像下面这样,
我们是使用gbk编码的,使用chardet却识别成KOI8-R编码。

请添加图片描述
所以为了编码诊断的准确,要尽量使用足够多的字符


四、编码与解码的区别

编码和解码,其实就是str与bytes的相互转化的过程(Python 2已经远去,这里以及后面都只用Python 3举例)

编码:encode方法,把字符串对象转化为二进制字节序列

解码:decode方法,把二进制字节序列转化为字符串对象

Unicode & Character Encodings in Python

那么假如我们真知道了其编码格式,如何来转成unicode呢?

有两种方法:

第一种是直接使用decode方法

 byte_obj.decode('gbk')

‘中文’

第二种是使用str类来转

str_obj=str(byte_obj,encoding='gbk')

str_obj

'中文'

五、如何设置文件编码

在Python 2中,默认使用的是ASCII编码来读取的,
因此,我们在使用Python 2的时候,
如果你的python文件里有中文,运行是会报错的。

SyntaxError:Non-ASCII character '\xe4' in file demo.py

原因就是ASCII编码表太小,无法解释中文。

而在Python 3中,默认使用的是uft-8来读取,所以省了不少的事。

对于这个问题,通常解决方法有两种:

第一种方法:在python2中,可以使用在头部指定

可以这样写,虽然很好看

# -*- coding: utf-8 -*-

但这样写太麻烦了,我通常使用下面两种写法

#coding:utf-8

#coding=utf-8

第二种方法:

import sys

reload(sys)


sys.setdefaultencoding('utf-8')

这里在调用sys.setdefaultencoding(‘utf-8’)设置默认的解码方式之前,

执行了reload(sys),这是必须的,

因为python在加载完sys之后,

会删除sys.setdefaultencoding这个方法,

我们需要重新载入sys,

才能调用sys.setdefaultencoding这个方法


👇问题解答 · 源码获取 · 技术交流 · 抱团学习请联系👇

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

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

相关文章

【经验】关于区分cin、getline、cin.getline三种字符串输入的区别

cin 既可以输入char[]数组&#xff0c;也可以输入string类型&#xff0c;输入会被空格打断 cin对char进行输入 #include<bits/stdc.h> using namespace std; int main(){char ch[50];cin>>ch;cout<<strlen(ch)<<endl;for(int i0;i<strlen(ch);i){…

1.移动机器人发展现状

移动机器人主要应用场景&#xff1a; 场景1.仓储机器人(AGV自动导引运输车)&#xff1a;电商企业用户下单后机器人可以实现自动分拣和发货。需要多个传感器配合 2.自动驾驶领域(AMR自主移动机器人):车辆避让行人、导航等 热点研究领域&#xff1a; 环境感知和建模、人机交互…

2022简要总结和2023行动指南

在这辞旧迎接之际&#xff0c;心存感恩&#xff0c;放眼未来。 祝宝妈妈宝&#xff0c;幸福快乐&#xff1b; 祝国泰民安&#xff0c;政通人和。 祝百融云创系&#xff0c;生意兴隆&#xff1b; 祝公司老板们&#xff0c;大展宏图&#xff1b; 祝同事同行er&#xff0c;身…

Java算法_LeetCode:旋转数组

旋转数组 给你一个数组&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,…

Fastsapi的小疑问

1. Fastapi中的get和post区别是什么&#xff1f; 答&#xff1a;get参数传输暴露在外&#xff0c;post隐式传输 GET参数获取&#xff1a;获取一个URL后面带?param11&param22这种形式。 特点&#xff1a;URL上直接编辑传输&#xff0c;方便快捷&#xff0c;但是信息暴露在…

【nowcoder】笔试强训Day16

目录 一、选择题 二、编程题 2.1扑克牌大小 2.2完全数计算 一、选择题 1.在关系型是数据库中&#xff0c;有两个不同的事务同时操作数据库中同一表的同一行&#xff0c;不会引起冲突的是&#xff1a; A. 其中一个DELETE操作&#xff0c;一个是SELECT操作 B. 其中两个都是…

植物大战僵尸:代码实现无限阳光

通过逆向分析植物阳光数量的动态地址找到阳光的基址与偏移&#xff0c;从而实现每次启动游戏都能够使用基址加偏移的方式定位阳光数据&#xff0c;最后我们将通过使用C语言编写通用辅助实现简单的无限阳光辅助&#xff0c;在教程开始之前我们先来说一下为什么会有动态地址与基址…

光缆单盘检测与光缆线路测试需使用双窗口吗?

1 引言 光缆线路和宽带接入工程中&#xff0c;通常会涉及光缆单盘检测与光缆线路的测试工作&#xff0c;光缆线路测试包括&#xff1a;中继段测试、用户光缆测试等。这些测试条目&#xff0c;有的只需采用测试仪表的1个波长进行测试&#xff0c;即单窗口测试&#xff0c;有的则…

代码随想录算法训练营第2天 977. 有序数组的平方、209. 长度最小的子数组

代码随想录算法训练营第2天| 977. 有序数组的平方、209. 长度最小的子数组 有序数组的平方 力扣题目链接(opens new window) 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 数组其实是有…

C 语法--编译相关

1&#xff0c; 单下划线和双下划线 #pragma #pragma 用于指示编译器完成一些特定的动作。#pragma 所定义的很多指示字是编译器特有的&#xff0c;在不同的编译器间是不可移植的 #pragma section APP_VERSION //__far const unsigned long version 0x01010101; __far const un…

redis缓存淘汰策略-基于LinkedHashMap实现LRU算法

redis缓存淘汰策略-LRU算法&#xff08;最近最少使用&#xff09; LRU是Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0c;是一种常用的页面置换算法&#xff0c; 选择最近最久未使用的数据予以淘汰。 1&#xff0c;所谓缓存&#xff0c; 必须要有读写两个操作…

【叨叨与总结】2022年总结

如果我记得没错&#xff0c;这个记录时间的软件应该是在6月份或者7月份才开始用的&#xff0c;大概记录的时间有半年。个人觉得还是不错的&#xff0c;下面还是简单的总结一下。   首先睡眠时长是有一定保障的&#xff0c;甚至有好多时候还睡了9、10个小时&#xff0c;当然这…

【Python基础】模块化编程-包调用

datitle: Python Module&&Invoking date: 2020-05-12 00:16:58 img: https://gitee.com/github-25970295/blogImage/raw/master/img/woman-3219507__340.webp categories: 编程语言 reprintPolicy: cc_by cover: false tags: python ​ 无论我们选择用何种语言进行程序…

2022年度总结:凝神聚力 踔厉奋发

2021年底手里握了几份offer&#xff0c;有研究型大学&#xff0c;也有教学型大学。是选择去前者继续拼搏&#xff0c;还是选择去后者直接躺平&#xff1f;二者的权衡和取舍确实不太容易抉择。尽管也咨询了很多前辈&#xff0c;最后还是得自己做决定。尽管我还是很喜欢做研究工作…

spark理论

前言&#xff1a; 本文是之前19年学生时学习林子雨老师《Spark大数据 》网易公开课的中关于spark的理论部分的部分笔记。主要包括大数据产品与spark的一些概念与运行原理介绍。 目录 大数据产品与hadoop生态系统 Spark概念 MapReduce与spark的比较 Spark运行 Spark运行基本流程…

【Spring 系列】Spring Session 深度解析

文章目录Spring Session 架构及应用场景为什么要spring-sessionSR340规范与spring-session的透明继承Spring Session探索特点核心 APIservlet session 与 spring-session 关系webflux 与 spring session 的关系基于 Servlet 的 Spring Session 实现思考题背景1、注册到 Filter …

Pytorch—模型微调(fine-tune)

随着深度学习的发展&#xff0c;在大模型的训练上都是在一些较大数据集上进行训练的&#xff0c;比如Imagenet-1k&#xff0c;Imagenet-11k,甚至是ImageNet-21k等。但我们在实际应用中&#xff0c;我们自己的数据集可能比较小&#xff0c;只有几千张照片&#xff0c;这时从头训…

RHCE——ansible环境配置(1)

配置ansible学习环境实现以下要求&#xff1a; 1.控制主机和受控主机通过root用户通过免密验证方式远程控住受控主机实施对应&#xff08;普通命令&#xff0c;特权命令&#xff09;任务 2.控制主机连接受控主机通过普通用户以免密验证远程控住受控主机实施指定&#xff08;普通…

雪花算法详解

背景 需要选择合适的方案去应对数据规模的增长&#xff0c;以应对逐渐增长的访问压力和数据量。 数据库的扩展方式主要包括&#xff1a;业务分库、主从复制&#xff0c;数据库分表。 数据库分表 将不同业务数据分散存储到不同的数据库服务器&#xff0c;能够支撑百万甚至千万…

计算机网络学习笔记

前言 本篇笔记方便本人用于复习回顾知识点&#xff0c;内容庞杂&#xff0c;见谅。含有目录方便大家跳转复习&#xff01; 此复习笔记总结于 湖科大教书匠出品&#xff1a;深入浅出计算机网络 微课视频 此笔记尚未完结&#xff0c;持续更新中… 文章目录前言第一章 概述1.1 …