Python bytes() 语法
bytes() 是 Python 的一个内置函数,它用于表示不可变的二进制数据。bytes 对象是不可变的,一旦创建就无法改变其中元素(包括添加元素、删除元素、修改元素)。
正是因为 bytes 二进制数据不可变的特性,bytes 类型主要应用于文件、网络通信等场景。
语法:
bytes(source, encoding='utf-8', errors='strict')说明:
bytes() 函数接收以下 3 个参数。
source(必选):操作的对象,可以是以下类型之一。- 当 source 是字符串:必须提供 encoding 参数,将字符串编码为字节序列。
- 当 source 是整数:表示创建一个提供大小的字节数组,所有字节初始化为 \x00。
- 当 source 是 bytes 对象:返回一个新的 bytes 对象,内容与原对象相同。
- 当 source 是包含整数的可迭代对象:每个整数必须在 0 到 255 之间,否则会抛出 ValueError。
- 当 source 未提供:返回一个空的 bytes 对象,即 b''。
encoding(可选,默认值: 'utf-8'):编码类型,当 source 是字符串时,指定编码方式。常见编码包括 'utf-8'、'ascii'、'latin-1' 等。errors(可选,默认值: 'strict'):指定编码错误处理方式,可选值包括:'strict':编码失败时抛出 UnicodeError(默认)。'ignore':忽略无法编码的字符。'replace':用 ? 替换无法编码的字符。'xmlcharrefreplace':用 XML 字符引用替换无法编码的字符。'namereplace':用 \N{...} 替换无法编码的字符。'backslashreplace':用 \x... 替换无法编码的字符。
字符串数据 vs 二进制数据
Python 3 最重要的新特性之一,就是对字符串和二进制做了明确的区分。字符串由 str 类型表示,它是以 “字符” 为单位进行处理。二进制由 bytes 类型或 bytearray 类型表示,它是以 “字节” 为单位进行处理。
bytes 类型也是一个不可变的序列对象,它的操作方法和 str 类型基本一样。bytes 类型通常用于网络数据传输、二进制图片和文件保存等方面。bytes 类型是通过 bytes() 函数生成的,其值形式为 b'xxxxx',其中 'xxxxx' 是一个或多个转义的十六进制字符串。
Python 不会以任何隐式的方式来混用 str 和 bytes,因此你不能将字符串和字节流进行拼接,也无法在字节流中搜索字符串,也不能将字符串作为字节流的函数参数。
Python bytes() 摘要
| 使用频率 | 中 |
|---|---|
| 官方文档 | 查看 |
| 相关函数 | bytearray()、memoryview() |
Python bytes() 示例
接下来,我们通过几个简单的例子来讲解一下 Python bytes() 函数是如何使用的。
示例 1:bytes() 将字符串转换为二进制数据
result = bytes('lvyenet', encoding='utf-8')
print(result)
print(type(result))运行结果如下。
b'lvyenet'
<class 'bytes'>分析:
当 bytes() 操作对象是一个字符串时,要求显式提供 encoding。对于上面例子来说,如果你只是写成 result = bytes('lvyenet'),则会报以下的错误。
(报错)TypeError: string argument without an encoding此外需要清楚的是,下面 3 种方式是等价的。
# 方式 1
result = bytes('lvyenet', encoding='utf-8')
# 方式 2
result = bytes('lvyenet', 'utf-8')
# 方式 3
result = b'lvyenet'示例 2:bytes() 创建指定大小的二进制数据
result = bytes(5)
print(result)运行结果如下。
b'\x00\x00\x00\x00\x00'示例 3:bytes() 将可迭代对象转换为二进制数据
nums = [1, 2, 3, 4, 5]
result = bytes(nums)
print(result)运行结果如下。
b'\x01\x02\x03\x04\x05'示例 4:bytes() 创建空的 bytes 对象
result = bytes()
print(result)运行结果如下。
b''bytes 常用操作
对于 bytes 对象来说,它常用的操作如下表所示。其中,obj 是一个 bytes 对象。
| 操作 | 说明 |
|---|---|
| len(obj) | 获取 bytes 对象中的字节数 |
| obj[index] | 获取 bytes 对象索引为 index 的字节 |
| obj[start:end] | 取 bytes 对象的切片,返回一个新的 bytes 对象。 |
| obj.count(sub, start, end) | 获取 bytes 对象中子序列 sub 出现次数 |
| obj.find(sub, start, end) | 查找 bytes 对象中子序列 sub 出现的位置 |
| obj.hex() | 返回 bytes 对象的十六进制表示 |
bytes 类型并没有想象中那么复杂,它只在特定场合下才会用到。大多数情况下,我们只需要它和字符串类型是如何相互转换的即可,也就是:
- bytesObject.decode('编码类型'):将二进制数据转换为字符串。
- strObject.encode('编码类型'):将字符串转换为二进制数据。
示例 5:bytes 与 str 互转
# str 转 bytes
s = '绿叶网'
b = s.encode('utf-8')
print(b)
# bytes 转 str
s_back = b.decode('utf-8')
print(s_back)运行结果如下。
b'\xe7\xbb\xbf\xe5\x8f\xb6\xe7\xbd\x91'
绿叶网bytes()、bytearray() 与 memoryview() 的区别
bytes()、bytearray() 与 memoryview() 这 3 个函数都可以用于操作二进制数据,它们之间的区别如下:
bytes():创建的对象是不可变的,适合表示不可变的二进制数据。bytearray():创建的对象是可变的,适合需要频繁修改的二进制数据。memoryview():创建内存视图,用于直接操作二进制数据。
| 函数 | 可变性 | 用途 |
|---|---|---|
| bytes() | 不可变 | 存储静态二进制数据(如文件内容) |
| bytearray() | 可变 | 频繁修改的二进制数据(如协议解析) |
| memoryview() | 内存视图 | 零拷贝操作缓冲区(如处理大型二进制数据) |
