我遵循了文档中有关如何在 Python 中使用 Base64 编码的示例:
>>> import base64 >>> encoded = base64.b64encode(b'data to be encoded') >>> encoded b'ZGF0YSB0byBiZSBlbmNvZGVk'
但是,如果我尝试对普通字符串进行编码-省略前导b:
b
>>> encoded = base64.b64encode('data to be encoded')
我得到了一个TypeError。在旧版本的 Python 中它看起来像:
TypeError
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python32\lib\base64.py", line 56, in b64encode raise TypeError("expected bytes, not %s" % s.__class__.__name__) TypeError: expected bytes, not str
在较新的版本中它可能看起来像:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.12/base64.py", line 58, in b64encode encoded = binascii.b2a_base64(s, newline=False) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: a bytes-like object is required, not 'str'
为什么会发生这种情况?
您遇到的错误是由于 Python 3 中处理字符串和字节的方式发生了变化。
在 Python 2 中,字符串 ( str) 和字节字符串 (unicode和str) 在某种程度上是可以互换的,这可能会引起混淆。然而,在 Python 3 中,两者有了明显的区别:
str
unicode
bytes
当您调用 时base64.b64encode(),它需要一个字节类对象作为参数。如果您传递一个普通字符串(str在 Python 3 中为 ),它会引发 ,TypeError因为该函数无法直接处理字符串——它需要数据为字节格式。
base64.b64encode()
要在 Python 3 中编码普通字符串,首先应将其转换为字节。您可以使用该encode()方法执行此操作:
encode()
import base64 # Correctly encoding a normal string encoded = base64.b64encode('data to be encoded'.encode('utf-8')) print(encoded)
encode('utf-8')
这一变化确保更好地处理文本和 b