Python 3 中字符串转字节的方法

Python 3 中字符串转字节的方法

技术背景

在 Python 3 中,字符串和字节是不同的数据类型。字符串是 Unicode 字符序列,而字节是 8 位整数序列。在处理文件、网络数据等场景时,常常需要将字符串转换为字节类型。

实现步骤

使用 bytesbytearray 构造函数

bytesbytearray 构造函数可以用于创建字节对象。当源参数为字符串时,必须提供编码参数。

1
2
3
my_str = "hello world"
my_bytes = bytes(my_str, encoding='utf-8')
print(my_bytes)

使用 str.encode() 方法

这是更 Pythonic 的方式,代码更具可读性。

1
2
3
my_str = "hello world"
my_bytes = my_str.encode() # 默认编码为 'utf-8'
print(my_bytes)

处理保存为 str 变量的原始 Unicode 序列

如果有一个保存为 str 变量的原始 Unicode 序列,需要获取其字节字面量,可以使用 raw_unicode_escape 编码。

1
2
3
s_str = "\x00\x01\x00\xc0\x01\x00\x00\x00\x04"
s_bytes = bytes(s_str, encoding="raw_unicode_escape")
print(s_bytes)

使用 memoryview

memoryview 提供了一种处理字节和更高级数据类型的灵活方式。

1
2
3
4
5
6
7
8
9
10
11
12
# 处理字节数组
result1 = memoryview(b"some bytes").tolist()
print(result1)

# 处理 Unicode 字符串
txt = "\u0075\u006e\u0069\u0063\u006f\u0064\u0065\u0020"
result2 = memoryview(txt.encode("UTF-16")).tolist()
print(result2)

# 处理多字节数据
result3 = memoryview(bytes(txt, "UTF-16")).cast("H").tolist()
print(result3)

核心代码

以下是几种常见转换方式的核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 使用 str.encode()
my_str = "hello world"
my_bytes = my_str.encode()
print(my_bytes)

# 使用 bytes 构造函数
my_bytes = bytes(my_str, encoding='utf-8')
print(my_bytes)

# 处理原始 Unicode 序列
s_str = "\x00\x01\x00\xc0\x01\x00\x00\x00\x04"
s_bytes = bytes(s_str, encoding="raw_unicode_escape")
print(s_bytes)

# 使用 memoryview
txt = "\u0075\u006e\u0069\u0063\u006f\u0064\u0065\u0020"
result = memoryview(txt.encode("UTF-16")).tolist()
print(result)

最佳实践

  • 推荐使用 str.encode() 方法,因为它更具可读性,且在性能上有一定优势。
1
2
my_str = "hello world"
my_bytes = my_str.encode()
  • 当使用 encode() 方法时,不指定编码参数,默认使用 'utf-8' 编码,这样会更快。

常见问题

Python 2 兼容性问题

在 Python 2 中,默认字符编码是 ASCII,使用 encode() 方法时可能会出现 UnicodeDecodeError。例如:

1
2
# Python 2 中会报错
print('äöä'.encode())

memoryview 字节序问题

在使用 memoryview 处理多字节数据时,要注意字节序的问题,不同的字节序可能会导致不同的结果。

1
2
3
4
txt = "\u0075\u006e\u0069\u0063\u006f\u0064\u0065\u0020"
for order in ("", "BE", "LE"):
mv = memoryview(bytes(txt, f"UTF-16{order}"))
print(mv.cast("H").tolist())

这种差异可能是有意设计的,也可能是一个潜在的问题,使用时需要注意。


Python 3 中字符串转字节的方法
https://119291.xyz/posts/python3-string-to-bytes-conversion/
作者
ww
发布于
2025年6月3日
许可协议