不能在 Python 中的类字节对象上使用字符串模式
Cannot use a string pattern on a bytes-like object in Python
当我们尝试使用字符串模式来匹配字节对象时,会出现 Python“TypeError: cannot use a string pattern on a bytes-like object”。
要解决该错误,请使用方法decode()
解码字节对象,例如
my_bytes.decode('utf-8')
。
下面是错误如何发生的示例。
主程序
import re my_bytes = b'apple,banana,kiwi' # ⛔️ TypeError: cannot use a string pattern on a bytes-like object m = re.search("apple", my_bytes)
我们尝试使用字符串模式来匹配不受支持的字节对象。
将字节对象解码为字符串
解决错误的一种方法是将字节对象解码为字符串。
主程序
import re my_bytes = b'apple,banana,kiwi' m = re.search("apple", my_bytes.decode('utf-8')) print(m) # 👉️ <re.Match object; span=(0, 5), match='apple'>
bytes.decode方法返回从给定字节解码的字符串。默认编码是utf-8
.
现在我们使用字符串模式在字符串中查找匹配项,这是允许的。
在类字节对象上使用字节模式
或者,您可以在类似字节的对象上使用字节模式。
主程序
import re my_bytes = b'apple,banana,kiwi' # 👇️ notice b'' prefix m = re.search(b"apple", my_bytes) print(m) # 👉️ <re.Match object; span=(0, 5), match=b'apple'>
请注意,我们传递给的第一个和第二个参数re.search
是字节对象。
两个参数都必须是兼容的类型,因为不允许混合字节对象和字符串。
我们以前使用过该bytes.decode()
方法。但是,如果需要将字符串转换为字节对象,则必须使用该str.encode()
方法。
主程序
my_str = 'bobbyhadz.com' my_bytes = my_str.encode(encoding='utf-8') print(my_bytes) # 👉️ b'bobbyhadz.com'
str.encode方法将字符串的编码版本作为字节对象返回。默认编码是
utf-8
.
string
编码是将 a 转换为对象的过程,解码是将对象转换为 a 的过程。 bytes
bytes
string
检查变量的类型
如果不确定变量存储的类型,请使用内置type()
类。
主程序
my_str = 'hello' print(type(my_str)) # 👉️ <class 'str'> print(isinstance(my_str, str)) # 👉️ True my_bytes = b'James Doe' print(type(my_bytes)) # 👉️ <class 'bytes'> print(isinstance(my_bytes, bytes)) # 👉️ True
类型
类
返回对象的类型。
如果传入的对象是传入类的实例或子类,则isinstance函数返回
。True