page contents

Python bytes类型及用法

在编码与解码中涉及到python中的字节串,那接下来来详细了解一下吧!

编码与解码

Python中bytes 类型用来表示一个字节串。

bytes 是 Python 3.x 新增的类型,在 Python 2.x 中是不存在的。

字节:(byte):是计算机中 数据处理 的基本单位

1B(byte,字节)= 8bit(位)

位:(bit):是计算机 内部数据 储存的最小单位,11001100是一个八位二进制数

字节串(bytes)和字符串(string)的对比:

1、字符串由若干个字符组成,以字符为单位进行操作;字节串由若干个字节组成,以字节为单位进行操作。

2、字节串和字符串除了操作的数据单元不同之外,它们支持的所有方法都基本相同。

3、字节串和字符串都是不可变序列,不能随意增加和删除数据。

bytes 只负责以字节序列的形式(二进制形式)来存储数据,至于这些数据到底表示什么内容(字符串、数字、图片、音频等),完全由程序的解析方式决定。如果采用合适的字符编码方式(字符集),字节串可以恢复成字符串;反之亦然,字符串也可以转换成字节串。

说白了,bytes 只是简单地记录内存中的原始数据,至于如何使用这些数据,bytes 并不在意,你想怎么使用就怎么使用,bytes 并不约束你的行为。

bytes 类型的数据非常适合在互联网上传输,可以用于网络通信编程;bytes 也可以用来存储图片、音频、视频等二进制格式的文件。

字符串和 bytes 存在着千丝万缕的联系,我们可以通过字符串来创建 bytes 对象,或者说将字符串转换成 bytes 对象。有以下三种方法可以达到这个目的:

1、如果字符串的内容都是 ASCII 字符,那么直接在字符串前面添加b前缀就可以转换成 bytes。

2、bytes 是一个类,调用它的构造方法,也就是 bytes(),可以将字符串按照指定的字符集转换成 bytes;如果不指定字符集,那么默认采用 UTF-8。

3、字符串本身有一个 encode() 方法,该方法专门用来将字符串按照指定的字符集转换成对应的字节串;如果不指定字符集,那么默认采用 UTF-8。

【实例】使用不同方式创建 bytes 对象:

#通过构造函数创建空 bytes
b1 = bytes()
#通过空字符串创建空 bytes
b2 = b''
#通过b前缀将字符串转换成 bytes
b3 = b'helloworld'
print("b3: ", b3)
#为 bytes() 方法指定字符集
b4 = bytes('六星教育', encoding='UTF-8')
print("b4: ", b4)
#通过 encode() 方法将字符串转换成 bytes
b5 = "六星教育".encode('UTF-8')
print("b5: ", b5)

运行结果:

b3:  b'helloworld'
b4:  b'\xe5\x85\xad\xe6\x98\x9f\xe6\x95\x99\xe8\x82\xb2'
b5:  b'\xe5\x85\xad\xe6\x98\x9f\xe6\x95\x99\xe8\x82\xb2'

从运行结果可以发现,对于非 ASCII 字符,print 输出的是它的字符编码值(十六进制形式),而不是字符本身。非 ASCII 字符一般占用两个字节以上的内存,而 bytes 是按照单个字节来处理数据的,所以不能一次处理多个字节。

bytes 类也有一个 decode() 方法,通过该方法可以将 bytes 对象转换为字符串。紧接上面的程序,添加以下代码:

#通过 decode() 方法将 bytes 转换成字符串
str1 = b5.decode('UTF-8')
print("str1: ", str1)

输出结果:

str1: 六星教育

刚刚在介绍 bytes 类型时,已经对 encode() 和 decode() 方法的使用做了简单的介绍,现在将对这 2 个方法做详细地说明。

我们知道,最早的字符串编码是 ASCII 编码,它仅仅对 10 个数字、26 个大小写英文字母以及一些特殊字符进行了编码。ASCII 码做多只能表示 256 个符号,每个字符只需要占用 1 个字节。

随着信息技术的发展,各国的文字都需要进行编码,于是相继出现了 GBK、GB2312、UTF-8 编码等,其中 GBK 和 GB2312 是我国制定的中文编码标准,规定英文字符母占用 1 个字节,中文字符占用 2 个字节;而 UTF-8 是国际通过的编码格式,它包含了全世界所有国家需要用到的字符,其规定英文字符占用 1 个字节,中文字符占用 3 个字节。

Python3.x 默认采用 UTF-8 编码格式,有效地解决了中文乱码的问题。

在 Python 中,有 2 种常用的字符串类型,分别为 str 和 bytes 类型,其中 str 用来表示 Unicode 字符,bytes 用来表示二进制数据。str 类型和 bytes 类型之间就需要使用 encode() 和 decode() 方法进行转换。

代码演示:

# 编码
s = '海内存知己天涯若比邻'
print(s.encode(encoding='GBK'))  # 在GBK这种编码格式中,一个中文占两个字节
# b'\xba\xa3\xc4\xda\xb4\xe6\xd6\xaa\xbc\xba\xcc\xec\xd1\xc4\xc8\xf4\xb1\xc8\xc1\xda'
print(s.encode(encoding='UTF-8'))  # 在UTF-8这种编码格式中,一个中文占三个字节
# b'\xe6\xb5\xb7\xe5\x86\x85\xe5\xad\x98\xe7\x9f\xa5\xe5\xb7\xb1\xe5\xa4\xa9\xe6\xb6\xaf\xe8\x8b\xa5\xe6\xaf\x94\xe9\x82\xbb'
# 解码
byte = s.encode(encoding='GBK')  # 编码
print(byte.decode(encoding='GBK'))  # 解码
byte = s.encode(encoding='UTF-8')  # 编码
print(byte.decode(encoding='UTF-8'))  # 解码

运行结果:

b'\xba\xa3\xc4\xda\xb4\xe6\xd6\xaa\xbc\xba\xcc\xec\xd1\xc4\xc8\xf4\xb1\xc8\xc1\xda'
b'\xe6\xb5\xb7\xe5\x86\x85\xe5\xad\x98\xe7\x9f\xa5\xe5\xb7\xb1\xe5\xa4\xa9\xe6\xb6\xaf\xe8\x8b\xa5\xe6\xaf\x94\xe9\x82\xbb'
海内存知己天涯若比邻
海内存知己天涯若比邻
  • 发表于 2021-06-17 16:48
  • 阅读 ( 975 )
  • 分类:Python开发

0 条评论

请先 登录 后评论
Cara
Cara

36 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章