Python3 数据编码方式

2024-08-29 16:08
文章标签 方式 python3 数据编码

本文主要是介绍Python3 数据编码方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1 Python3 的数据编码
      • 1.1 字符串
      • 1.2 字节串
    • 2 字符串与字节串的相互转化
      • 2.1 字符串转化为字节串
      • 2.2 字节串转化为字符串
    • 3 十六进制字符串
      • 3.1 十六进制字符串转化为字节串
      • 3.2 字节串转化为十六进制字符串
    • 4 参考资料

1 Python3 的数据编码

Python3 统一了编码方式,字符串就是 str,字节串就是 bytes。字符串 str 其实就是文本,统一使用 Unicode 编码。而字节串 bytes 就是原始的字节,本质是二进制数值。它们两者之间可以互相转化。

1.1 字符串

字符串举例:

>>> s = '字符串abc'
>>> s
'字符串abc'
>>> type(s)
<class 'str'>

如上例,字符串使用引号表示。Python3 统一使用 Unicode 编码,所以可以正常显示多种语言文字。

1.2 字节串

字节串举例:

>>> b = b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'
>>> b
b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'
>>> type(b)
<class 'bytes'>

如上例,一个字节串是以 b 开头,每个字节使用十六进制数值表示的串。因为字节串是存储于计算机中的最原始的数据,本质上二进制数值,但是为了提高阅读效率,一般使用十六进制表示。每个字节以 \x 开头,表示这是一个原始的二进制值。但是,在上例中,最后三个字节却没有以 \x 开头,显示的是字母 abc。这就牵扯到 Python 的显示规则了,如果该十六进制值表示的是能够打印的 ASCII 码值,那么就直接打印出来,不使用十六进制表示。实际上,如果将末尾字母 abc 使用以 \x 开头的十六进制表示,其本质也是相等的。

>>> a = b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'
>>> b = b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\x61\x62\x63'
>>> a == b
True

如上例,将 abc 使用其对应的十六进制 0x61,0x62,0x63表示,也是与原始字节串相等的。

2 字符串与字节串的相互转化

字符串与字节串的转化可以使用 encode() 和 decode() 两个函数:

  • 字符串转化为字节串:encode(),编码。
  • 字节串转化为字符串:decode(),解码。

encode 和 decode 默认采用 utf-8 编码。

2.1 字符串转化为字节串

>>> '字符串abc'.encode()
b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'

2.2 字节串转化为字符串

>>> b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'.decode()
'字符串abc'

3 十六进制字符串

在实际编程中,经常遇到十六进制字符串。

>>> s = 'cc4a5ce1b3'
>>> type(s)
<class 'str'>

如上例,为了说明方便,本文把形如上例的字符串 s 称为十六进制字符串。当然,该字符串的长度肯定是偶数。s 本质上是一个字符串,但是在实际的编程实例中,其表示原始数据,为了用户友好,将原始的字节数值转化为用户可以看到的十六进制字符串。

3.1 十六进制字符串转化为字节串

在数据运算中,例如将该数据进行哈希运算,肯定要对其原始二进制数值进行哈希运算。那么就需要将该十六进制字符串转化为原始的字节串。

在 Python3 中,可以使用 bytes.fromhex()、binascii.a2b_hex()、binascii.unhexlify() 函数将十六进制字符串转化为其原始二进制数值,即以 \x 开头表示的每个字节。

>>> bytes.fromhex('cc4a5ce1b3')
b'\xccJ\\\xe1\xb3'
>>> binascii.a2b_hex('cc4a5ce1b3')
b'\xccJ\\\xe1\xb3'
>>> binascii.unhexlify('cc4a5ce1b3')
b'\xccJ\\\xe1\xb3'

如上例,以上三个函数都可将十六进制字符串转化为以 b 开头的字节串。但是,推荐使用 bytes.fromhex() 函数。这是因为该函数可以有效处理十六进制字符串中的空格,可以自动处理空格。

>>> bytes.fromhex('cc4a  5c e1b3')
b'\xccJ\\\xe1\xb3'

如上例所示,如果十六进制字符串中含有空格,则 bytes.fromhex() 函数可以正确处理。

3.2 字节串转化为十六进制字符串

可以使用 hex() 函数将原始数据字节串转化为可以阅读的十六进制字符串。该函数是 Python3.5 新加入的。

>>> b'\xccJ\\\xe1\xb3'.hex()
'cc4a5ce1b3'
>>> binascii.b2a_hex(b'\xccJ\\\xe1\xb3').decode()
'cc4a5ce1b3'
>>> binascii.hexlify(b'\xccJ\\\xe1\xb3').decode()
'cc4a5ce1b3'

如上例,可将以 b 开头的字节串转化为十六进制字符串。虽然有三种方式可以此目标,但是还是推荐使用 hex() 函数更简单快捷。

4 参考资料

  • python3的decode()与encode()

这篇关于Python3 数据编码方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118323

相关文章

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流