Python bytes() 函数

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 对象。

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()
函数 可变性 用途
bytes() 不可变 存储静态二进制数据(如文件内容)
bytearray() 可变 频繁修改的二进制数据(如协议解析)
memoryview() 内存视图 零拷贝操作缓冲区(如处理大型二进制数据)

上一篇: complex()

下一篇: bytearray()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号