Python数据类型之字节串(Bytes)
Python中的字节串类型(bytes)是在Python 3.0版本中新增的类型。在Python 2.x版本中,字节串类型被称为字符串类型(str),但在Python 3.0中,字符串类型被重命名为文本字符串类型(str),而字节串类型被引入并命名为bytes。
字节串类型用于表示二进制数据,可以包含任何字节值,包括ASCII字符和非ASCII字符。在Python 3.0中,字节串类型和文本字符串类型被明确区分,这使得处理二进制数据和文本数据更加灵活和方便。
由于 bytes 保存的就是原始的字节(二进制格式)数据,因此 bytes 对象可用于在网络上传输数据,也可用于存储各种二进制格式的文件,比如图片、音乐等文件。
知识先导
-
字节概念
字节(Byte )是计算机用于计量存储容量和传输容量的一种计量单位。一个字节等于8位二进制数,也就是8位(bit),即它包含八位的二进制数。在计算机中,数据存储和传输都是以字节为单位进行的。
位(bit):是计算机 内部数据 储存的最小单位,
1bit
代表1位二进制数,其值要么是0,要么是1。11001100
是一个八位二进制数;字节(byte):是计算机中 数据处理 的基本单位,习惯上用大写
B
来表示,1B
(byte,字节)= 8bit
(位) -
字符概念
字符 是指计算机中使用的字母、数字、字和符号,包括:
1、2、3、A、B、C、~!·#¥%……—*()——+
等等。在UTF-8
编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3个字节。转换为bit(位)
来计算, 一个英文就用八位二进制数表示,一个汉字就用3个八位二进制数表示。 -
字符串概念
字符串 是字符序列,它是一种抽象的概念,不能直接存储在硬盘。在存储时,需要将字符串中的每个字符转换为字节,然后进行存储。
-
字节串概念
字节串 是字节序列,它可以直接存储在硬盘。它们之间的映射被称为编码/解码。
在Python中,程序中的文本都用字符串表示。
在字节串中每个数据单元都是字节,也就是 8 位,其中每 4 位(相当于 4 位二进制数,最小值为 0 ,最大值为 15)可以用一个十六进制数来表示,因此每字节需要两个十六进制数表示,
b'\xe6\x88\x91\xe7\x88\xb1Python\xe7\xbc\x96\xe7\xa8\x8b', # 比如 :\xe6 就表示 1 字节,其中 \x 表示十六进制,e6 就是两位的十六进制数。
字节串与字符串之间的区别
bytes 和 str 除操作的数据单元不同之外,它们支持的所有方法都基本相同,bytes 也是不可变序列。
- 字符串(str)由多个字符组成,以字符为单位进行操作;
- 字节串(bytes)由多个字节组成,以字节为单位进行操作。
字节串创建
创建字符串,主要有如下三种方式:
-
如果字符串内容都是 ASCII 字符,则可以通过直接在字符串之前添加
b
来构建字节串值。# 创建一个空的bytes b1 = bytes() print(b1) # b'' print(type(b1)) # <class 'bytes'> # 创建一个空的bytes值,等同于 b'' b2 = b'' print(b2) # b'' print(type(b2)) # <class 'bytes'> # 创建非空字节串值,通过b前缀指定hello是bytes类型的值 b3 = b'hello' print(b3) # b'hello' # ASCII编码中 h对应的十进制编码为104 print(b3[0]) # 104 print(b3[2:4]) # b'll' # ASCII编码 十六进制A,B分别对应41,42,\x代表十六进制 b = b'\x41\x42' print(b) # b'AB'
-
调用 bytes() 函数(其实是 bytes 的构造函数)将字符串按指定字符集转换成字节串,如果不指定字符集,默认使用
UTF-8
字符集。bytes()
生成一个空的字节串 等同于b''
;bytes(整型可迭代对象)
用可迭代对象初始化一个字节串,不能超过255;bytes(整数n)
生成n
个值为零的字节串;bytes(字符串, encoding='utf-8')
用字符串的转换编码生成一个字节串;
# 创建一个空的bytes b = bytes() print(b1) # b'' b2 = bytes(range(65,65+26)) print(b2) # b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' b1 = bytes(5) print(b1)# b'\x00\x00\x00\x00\x00' # `hello`中的字符属于ASCII编码集,`中国`不属于ASCII编码集,根据UTF-8编码规则,一个中文字符由3字节表示 b = bytes('hello,中国', encoding='UTF-8') print(b) #b'hello,\xe4\xb8\xad\xe5\x9b\xbd'
-
调用字符串本身的encode() 方法将字符串按指定字符集转换成字节串(常用)。如果不指定字符集,默认使用 UTF-8 字符集。
s = 'hello,中国!' b = s.encode(encoding='UTF-8') print(b) #b'hello,\xe4\xb8\xad\xe5\x9b\xbd\xef\xbc\x81'
字符串和字节串转化
-
字符串(
str
)编码为字节串(bytes
)b = s.encode('utf-8')
-
字节串(
bytes
)解码为字符串(str
)s = b.decode('utf-8')
s = 'hello,中国!'
b = s.encode(encoding='UTF-8')
print(b) #b'hello,\xe4\xb8\xad\xe5\x9b\xbd\xef\xbc\x81'
s1 = b.decode(encoding='utf-8')
print(s1) #hello,中国!
参考文章
Python中字节串和字符串,不是一个概念没有区别之分_AllardZhao的博客-CSDN博客
Python(00):bytes字节串类型及用法 - springsnow - 博客园 (cnblogs.com)
[Python之字节串 - 简书 (jianshu.com)](
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码