Python bytes字节类型的用法(非常详细)
bytes
是 Python 中的字节类型,是用来处理二进制数据的。
在实际开发时,虽然我们更多地使用字符串来处理文本,但处理原始的二进制数据时,比如文件内容、网络传输数据或编码转换时,bytes 类型就派上用场了。
在 Python 中,bytes 类型表示一个不可变的字节序列,每个字节是一个 0 到 255 之间的整数(即 8 位二进制数),通常用来存储和处理二进制数据。
Python 程序中创建字节对象的方式有以下几种:
- 使用 b 前缀:直接在字符串前加 b,但只能包含 ASCII 字符(值在 0-127 之间);
- 使用 bytes() 函数:从可迭代对象(如列表)或字符串(指定编码)创建;
-
从字符串编码:通过字符串的
encode()
方法转换为字节。
例如:
# 使用 b 前缀 b1 = b"Python" print(b1) # 输出 b'Python' # 从列表创建 b2 = bytes([80, 121, 116, 104, 111, 110]) print(b2) # 输出 b'Python' # 从字符串编码 s = "你好" b3 = s.encode("utf-8") print(b3) # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd'
注意:b"Python"
是 ASCII 编码的字节,而 "你好"
编码成 UTF-8 后显示为十六进制表示,因为它超出了 ASCII 范围。
注意,字节类型(bytes)和字符串类型(str)有很相似,它们的本质区别是:字符串是基于字符的文本数据,而字节是纯粹的二进制数据。在 Python 3 中,bytes 和 str 被明确区分开,bytes 适合处理低级数据,而 str 适合处理人类可读的文本。
要创建字节对象,通常在普通字符串前加一个
b
前缀,或者使用bytes()
函数。
Python bytes类型的常见操作
1) 索引与切片
bytes 对象是一个序列,可以通过索引或切片访问其中的字节。索引返回的是整数(0-255),而不是字符。
例如:
b = b"Hello" print(b[0]) # 索引:输出 72(H 的 ASCII 值) print(b[1:4]) # 切片:输出 b'ell' print(b[::-1]) # 输出 b'olleH'(反转)
由于字节是不可变的,不能通过索引修改其内容,比如 b[0] = 65
会报错。
2) 拼接与重复
bytes 对象支持用 + 拼接和用 * 重复,但操作数必须都是 bytes 类型,不能直接与字符串混合。
例如:
b1 = b"Py" b2 = b"thon" b3 = b1 + b2 # 拼接 b4 = b1 * 3 # 重复 print(b3) # 输出 b'Python' print(b4) # 输出 b'PyPyPy'
3) 字节和字符串的转换
字节和字符串之间的转换是 bytes 类型使用的核心。转换需要指定编码方式,常见编码包括 "utf-8"、"ascii" 等。
使用 encode() 方法将字符串转换为字节:
s = "Hello, 世界" b = s.encode("utf-8") print(b) # 输出 b'Hello, \xe4\xb8\x96\xe7\x95\x8c'
使用 decode() 方法将字节转换为字符串:
b = b'Hello, \xe4\xb8\x96\xe7\x95\x8c' s = b.decode("utf-8") print(s) # 输出 Hello, 世界
注意,编码和解码时必须使用相同的编码方式,否则会抛出 UnicodeDecodeError
。
4) 字节的常用方法
bytes 类型支持一些与字符串类似的方法,但返回结果通常是 bytes 类型。以下是几个常用方法:
方法 | 功能 | 示例 |
---|---|---|
hex() | 转换为十六进制字符串 | b"ab".hex() 返回 "6162" |
find(sub) | 查找子字节的位置 | b"Python".find(b"th") 返回 2 |
replace(old, new) | 替换子字节 | b"cat".replace(b"c", b"b") 返回 b"bat" |
split(sep) | 按分隔符拆分 | b"a,b".split(b",") 返回 [b"a", b"b"] |
例如:
b = b"Python Programming" print(b.find(b"Pro")) # 输出 7 print(b.replace(b"P", b"Q")) # 输出 b"Qython Qrogramming" print(b.split(b" ")) # 输出 [b'Python', b'Programming']
5) 字节与文件操作
bytes 类型在文件读写中非常常见,因为文件内容本质上是二进制数据。
例如:
# 写入字节到文件 with open("test.bin", "wb") as f: f.write(b"Binary Data") # 读取字节 with open("test.bin", "rb") as f: data = f.read() print(data) # 输出 b'Binary Data'
上述代码使用了 "wb"(写二进制)和 "rb"(读二进制)模式,专门处理字节数据。
总结
在 Python 程序中,使用 bytes 字节类型需要注意以下几点:- 不可变性:与字符串一样,bytes 对象不可修改,只能创建新对象。
- 编码问题:处理非 ASCII 字符时,必须正确指定编码,否则会出错。
- 长度:用 len() 获取字节数,例如 len(b"abc") 返回 3。
- 与 bytearray 的区别:bytearray 是可变的字节序列,而 bytes 不可变。
读完全文,你已经学会 Python bytes 字节类型的用法,下面的实例运用了编码解码的知识,将用户输入的文本编码为字节并解码回字符串:
text = input("请输入文本:") byte_data = text.encode("utf-8") print(f"字节表示:{byte_data}") decoded_text = byte_data.decode("utf-8") print(f"解码结果:{decoded_text}")
运行程序,输出结果为:
请输入文本:Hello, 世界 字节表示:b'Hello, \xe4\xb8\x96\xe7\x95\x8c' 解码结果:Hello, 世界