字符串用于表示人类可读的文本,是计算机编程中最基本且重要的数据类型之一。然而,文本字符串中的每个字符都由一个或多个字节的二进制数据表示。输入输出操作和数据传输等应用需要使用特定编码将字符串转换为字节。
本教程将探讨在 Python 中将字符串转换为字节的方法。如果您对反向操作感兴趣,请查看我关于如何在 Python 中将字节转换为字符串的教程。
在进入细节之前,我们先给着急的读者一个简短答案。
简短答案:如何在 Python 中将字符串转换为字节
Python 提供了内置的 .encode() 方法,可轻松将字符串转换为字节:
my_string = "Hello, world!"
bytes_representation = my_string.encode(encoding="utf-8")
print(bytes_representation)
技术支持
.encode() 方法会返回一个新的 bytes 对象,表示原始字符串的编码结果。默认使用 UTF-8 编码,但您也可以根据需要指定其他编码,如 'ascii' 或 'latin-1'。
下面我们更详细地了解这一转换过程。
理解 Python 中的字符串与字节
Python 的两个核心内置数据类型是 str 和 bytes。它们有共同点,但也存在关键差异。
str 和 bytes 都是不可变序列,这意味着一旦创建,我们无法修改其元素。字符串是不可变的字符序列,而 bytes 对象是由 0 到 255 之间的整数构成的不可变序列。这个整数范围可以用 8 位表示,即一个字节。因此,bytes 对象就是字节序列。
ASCII 字符编码
我们先来看 ASCII 字符。ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种只包含 128 个字符的字符编码。因此,任何 ASCII 字符都可以用 7 位表示,少于一个完整字节。
我们可以在通常用于字符串的单引号、双引号或三引号前加上 b 来创建一个 bytes 对象:
word_as_bytes = b"Python"
print(word_as_bytes)
print(type(word_as_bytes))技术支持
b'Python'
<class 'bytes'>技术支持
尽管代码显示的是“Python”这几个字符,bytes 对象中的每个元素其实都是 0 到 255 之间的整数:
print(word_as_bytes[0])
print(list(word_as_bytes))技术支持
80
[80, 121, 116, 104, 111, 110]技术支持
word_as_bytes 的第一个元素是整数 80,它是大写字母 P 的 ASCII 码:
print(chr(80))技术支持
P技术支持
当将 word_as_bytes 转换为列表时,列表包含表示每个字节的整数。这些整数就是单词 Python 中各字母的 ASCII 码。
然而,ASCII 字符集是有限的。
UTF-8 字符编码
最常见的字符编码是 UTF-8,它是一种 8 位的 Unicode 编码。128 个 ASCII 字符在 UTF-8 中由相同的整数表示,但其他字符则可能需要两个或更多字节来表示每个字符。
我们来用非 ASCII 字符创建一个 bytes 对象。这里需要使用 bytes() 构造函数:
word_as_bytes = bytes("café", "utf-8")
print(word_as_bytes)技术支持
b'caf\xc3\xa9'技术支持
bytes 对象会直接显示 café 的前三个字母。然而,带重音的 é 不是 ASCII 字符,它由两个字节表示,显示为 \xc3 和 \xa9。这两个字节分别是十六进制数 c3 和 a9,即整数 195 和 169。它们组合在一起在 UTF-8 中表示 é:
print(len(word_as_bytes))
print(list(word_as_bytes))技术支持
5
[99, 97, 102, 195, 169]技术支持
这个五个元素的 bytes 对象表示了包含四个字母的字符串。
将字符串转换为字节:encode() 方法
之前我们使用了 bytes() 构造函数将文本字符串转换为 bytes 对象。更常见的做法是使用字符串的 .encode() 方法,它可以控制编码和错误处理。该方法返回一个表示该字符串的 bytes 对象:
word_as_bytes = "Hello Python!".encode()
print(word_as_bytes)
print(type(word_as_bytes))
技术支持
b'Hello Python!'
<class 'bytes'>技术支持
.encode() 方法默认使用 UTF-8 编码。UTF-8 是使用最广泛的编码格式,支持的字符范围远大于 ASCII。UTF-8 使用由一到四个字节单元组成的序列来表示每个字符。
我们可以为 .encode() 传入其他编码作为参数:
word_as_bytes = "Hello Python!".encode("utf-16")
print(word_as_bytes)技术支持
b'\xff\xfeH\x00e\x00l\x00l\x00o\x00 \x00P\x00y\x00t\x00h\x00o\x00n\x00!\x00'技术支持
此时的 bytes 对象不同,因为它表示同一文本字符串的 UTF-16 编码。
编码错误
由于并非所有编码都包含所有字符,将字符串编码为 bytes 对象时可能会出现错误。
来看字符串 "Café • £2.20",其中包含三个非 ASCII 字符。我们可以使用默认的 UTF-8 编码对其进行编码:
word_as_bytes = "Café • £2.20".encode()
print(word_as_bytes)技术支持
b'Caf\xc3\xa9 \xe2\x80\xa2 \xc2\xa32.20'技术支持
这些非 ASCII 字符被替换为其十六进制转义序列。然而,如果使用 ASCII 对同一字符串进行编码,由于其中有多个字符不在 ASCII 编码中,.encode() 会抛出错误:
word_as_bytes = "Café • £2.20".encode("ascii")
print(word_as_bytes)技术支持
Traceback (most recent call last):
...
word_as_bytes = "Café • £2.20".encode("ascii")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 3: ordinal not in range(128)技术支持
.encode() 字符串方法有一个 errors 参数,默认值为 "strict"。当某个字符无法编码时,参数为 "strict" 会让 .encode() 抛出 UnicodeEncodeError。
不过还有其他错误处理选项。一个选项是使用 "ignore" 参数忽略错误:
word_as_bytes = "Café • £2.20".encode("ascii", errors="ignore")
print(word_as_bytes)技术支持
b'Caf 2.20'技术支持
这种做法不会抛出错误。相反,.encode() 返回一个 bytes 对象,而带重音的 é、项目符号以及英镑符号会被省略。
另一种做法是将无法编码的字符替换为其他内容。可用的替换方式有多种,其中之一是使用 errors="replace" 参数:
word_as_bytes = "Café • £2.20".encode("ascii", errors="replace")
print(word_as_bytes)技术支持
b'Caf? ? ?2.20'技术支持
在此示例中,三个无法编码的非 ASCII 字符被替换为问号。因此,每个缺失字符都由另一个单字符占位符替代。
我们也可以用更具信息量的文本替换缺失字符:
word_as_bytes = "Café • £2.20".encode("ascii", errors="backslashreplace")
print(word_as_bytes)技术支持
b'Caf\\xe9 \\u2022 \\xa32.20'技术支持
使用 errors="backslashreplace" 调用 .encode() 会将无法编码的字符替换为其十六进制转义序列。十六进制数 e9 表示带重音的 é;项目符号是 Unicode 字符 u2022;十六进制数 a3 表示英镑符号。
我们还可以使用 "xmlcharrefreplace" 将缺失字符替换为其 XML 代码:
word_as_bytes = "Café • £2.20".encode("ascii", errors="xmlcharrefreplace")
print(word_as_bytes)技术支持
b'Café • £2.20'技术支持
另一个选项是使用 errors="namereplace" 将无效字符替换为其规范名称:
word_as_bytes = "Café • £2.20".encode("ascii", errors="namereplace")
print(word_as_bytes)技术支持
b'Caf\\N{LATIN SMALL LETTER E WITH ACUTE} \\N{BULLET} \\N{POUND SIGN}2.20'技术支持
不同场景可能需要定制化的错误处理,.encode() 字符串方法为处理无法编码的字符提供了多种选项。
字符串到字节转换在数据科学中的应用
字符串到字节的转换是一项基础操作,在数据科学的多个领域都有应用:
- 自然语言处理(NLP):在执行情感分析、主题建模或机器翻译等文本任务时,我们常常通过将文本分词为词或子词来进行预处理。分词过程经常涉及将字符串转换为字节序列,以便高效表示和操作。
- 数据清洗与预处理: 字节级操作可用于清理文本数据,例如根据特定字节模式删除无效字符或规范化文本。
- 特征工程: 在某些情况下,可以从文本数据中提取字节级特征(例如字节 n-gram),并将其用作机器学习模型的输入特征。
- 网页抓取与数据提取: 抓取网站数据时,我们经常接收到 HTML 或其他基于文本的内容,可能需要在字节层面进行解析和处理以提取相关信息。
- 数据压缩: 某些数据压缩算法在字节序列上运行,因此在应用压缩技术前需要将字符串转换为字节。
了解这些应用有助于我们识别将字符串转换为字节会发挥作用的情形。
结论
字符串是由人类可读字符构成的序列。这些字符以二进制数据的字节形式进行编码,并可存储在 bytes 对象中。bytes 对象是一个整数序列,每个整数代表一个字节。
许多应用需要将字符串转换为 bytes 对象,我们可以使用 bytes() 构造函数或字符串的 .encode() 方法来完成转换。掌握字符串与字节之间的转换能够实现更灵活的数据操作。
您可以通过以下教程和课程继续学习 Python:
字符串用于表示人类可读的文本,是计算机编程中最基本且重要的数据类型之一。然而,文本字符串中的每个字符都由一个或多个字节的二进制数据表示。输入输出操作和数据传输等应用需要使用特定编码将字符串转换为字节。
本教程将探讨在 Python 中将字符串转换为字节的方法。如果您对反向操作感兴趣,请查看我关于如何在 Python 中将字节转换为字符串的教程。
在进入细节之前,我们先给着急的读者一个简短答案。
简短答案:如何在 Python 中将字符串转换为字节
Python 提供了内置的
.encode()方法,可轻松将字符串转换为字节:.encode()方法会返回一个新的 bytes 对象,表示原始字符串的编码结果。默认使用 UTF-8 编码,但您也可以根据需要指定其他编码,如'ascii'或'latin-1'。下面我们更详细地了解这一转换过程。
理解 Python 中的字符串与字节
Python 的两个核心内置数据类型是
str和bytes。它们有共同点,但也存在关键差异。str和bytes都是不可变序列,这意味着一旦创建,我们无法修改其元素。字符串是不可变的字符序列,而bytes对象是由 0 到 255 之间的整数构成的不可变序列。这个整数范围可以用 8 位表示,即一个字节。因此,bytes对象就是字节序列。ASCII 字符编码
我们先来看 ASCII 字符。ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种只包含 128 个字符的字符编码。因此,任何 ASCII 字符都可以用 7 位表示,少于一个完整字节。
我们可以在通常用于字符串的单引号、双引号或三引号前加上 b 来创建一个
bytes对象:尽管代码显示的是“Python”这几个字符,
bytes对象中的每个元素其实都是 0 到 255 之间的整数:word_as_bytes的第一个元素是整数80,它是大写字母 P 的 ASCII 码:当将
word_as_bytes转换为列表时,列表包含表示每个字节的整数。这些整数就是单词 Python 中各字母的 ASCII 码。然而,ASCII 字符集是有限的。
UTF-8 字符编码
最常见的字符编码是 UTF-8,它是一种 8 位的 Unicode 编码。128 个 ASCII 字符在 UTF-8 中由相同的整数表示,但其他字符则可能需要两个或更多字节来表示每个字符。
我们来用非 ASCII 字符创建一个
bytes对象。这里需要使用bytes()构造函数:bytes对象会直接显示 café 的前三个字母。然而,带重音的 é 不是 ASCII 字符,它由两个字节表示,显示为\xc3和\xa9。这两个字节分别是十六进制数 c3 和 a9,即整数 195 和 169。它们组合在一起在 UTF-8 中表示 é:这个五个元素的
bytes对象表示了包含四个字母的字符串。将字符串转换为字节:encode() 方法
之前我们使用了
bytes()构造函数将文本字符串转换为bytes对象。更常见的做法是使用字符串的.encode()方法,它可以控制编码和错误处理。该方法返回一个表示该字符串的bytes对象:.encode()方法默认使用 UTF-8 编码。UTF-8 是使用最广泛的编码格式,支持的字符范围远大于 ASCII。UTF-8 使用由一到四个字节单元组成的序列来表示每个字符。我们可以为
.encode()传入其他编码作为参数:此时的
bytes对象不同,因为它表示同一文本字符串的 UTF-16 编码。编码错误
由于并非所有编码都包含所有字符,将字符串编码为
bytes对象时可能会出现错误。来看字符串
"Café • £2.20",其中包含三个非 ASCII 字符。我们可以使用默认的 UTF-8 编码对其进行编码:这些非 ASCII 字符被替换为其十六进制转义序列。然而,如果使用 ASCII 对同一字符串进行编码,由于其中有多个字符不在 ASCII 编码中,
.encode()会抛出错误:.encode()字符串方法有一个errors参数,默认值为"strict"。当某个字符无法编码时,参数为 "strict" 会让.encode()抛出UnicodeEncodeError。不过还有其他错误处理选项。一个选项是使用
"ignore"参数忽略错误:这种做法不会抛出错误。相反,
.encode()返回一个bytes对象,而带重音的 é、项目符号以及英镑符号会被省略。另一种做法是将无法编码的字符替换为其他内容。可用的替换方式有多种,其中之一是使用
errors="replace"参数:在此示例中,三个无法编码的非 ASCII 字符被替换为问号。因此,每个缺失字符都由另一个单字符占位符替代。
我们也可以用更具信息量的文本替换缺失字符:
使用
errors="backslashreplace"调用.encode()会将无法编码的字符替换为其十六进制转义序列。十六进制数 e9 表示带重音的 é;项目符号是 Unicode 字符 u2022;十六进制数 a3 表示英镑符号。我们还可以使用
"xmlcharrefreplace"将缺失字符替换为其 XML 代码:另一个选项是使用
errors="namereplace"将无效字符替换为其规范名称:不同场景可能需要定制化的错误处理,
.encode()字符串方法为处理无法编码的字符提供了多种选项。字符串到字节转换在数据科学中的应用
字符串到字节的转换是一项基础操作,在数据科学的多个领域都有应用:
了解这些应用有助于我们识别将字符串转换为字节会发挥作用的情形。
结论
字符串是由人类可读字符构成的序列。这些字符以二进制数据的字节形式进行编码,并可存储在
bytes对象中。bytes对象是一个整数序列,每个整数代表一个字节。许多应用需要将字符串转换为
bytes对象,我们可以使用bytes()构造函数或字符串的.encode()方法来完成转换。掌握字符串与字节之间的转换能够实现更灵活的数据操作。您可以通过以下教程和课程继续学习 Python: