AttributeError: ‘bytes’ 对象没有属性 ‘encode’
AttributeError: ‘bytes’ object has no attribute ‘encode’
encode()
当我们在字节对象上调用方法时,会出现 Python“AttributeError: ‘bytes’ object has no attribute ‘encode’” 。
要解决该错误,请删除对该方法的调用,encode()
因为该变量已经存储了一个字节对象。
下面是错误如何发生的示例。
my_str = 'bobbyhadz.com' my_bytes = my_str.encode('utf-8') print(type(my_bytes)) # 👉️ <class 'bytes'> # ⛔️ AttributeError: 'bytes' object has no attribute 'encode'. Did you mean: 'decode'? result = my_bytes.encode('utf-8')
代码示例中的问题是我们正在尝试对bytes
对象进行编码。
string
编码是将 a 转换为对象的过程,解码是将对象转换为 a 的过程。 bytes
bytes
string
你不必encode()
在字节对象上调用方法
要解决该错误,请删除对该encode()
方法的调用。
my_str = 'bobbyhadz.com' print(type(my_str)) # 👉️ <class 'str'> my_bytes = my_str.encode('utf-8') print(type(my_bytes)) # 👉️ <class 'bytes'>
该encode()
方法用于将字符串转换为字节,因此不能在字节对象上调用该方法。
使用try/except
语句来处理错误
如果您不确定您拥有的是字节对象还是字符串,请使用
try/except语句来处理可能的AttributeError
.
my_str = 'bobbyhadz.com' print(type(my_str)) # 👉️ <class 'str'> try: encoded = my_str.encode('utf-8') print(encoded) # 👉️ b'bobbyhadz.com' print(type(encoded)) # 👉️ <class 'bytes'> except AttributeError: pass
我们尝试对值进行编码,如果它没有属性encode()
(不是字符串),我们将处理AttributeError
.
创建一个可重用的函数来处理错误
您还可以将逻辑提取到可重用函数中。
def encode(string): try: encoded = string.encode('utf-8') return encoded except AttributeError: return string result = encode('bobbyhadz.com') print(result) # 👉️ b'bobbyhadz.com' result = encode(b'bobbyhadz.com') print(result) # 👉️ b'bobbyhadz.com'
该函数尝试将传入的值编码为字节对象,如果
AttributeError
引发 an,则该值按原样返回。
string
编码是将 a 转换为对象的过程,解码是将对象转换为 a 的过程。 bytes
bytes
string
在调用 encode() 之前检查变量的类型
另一种方法是在调用方法之前使用if
语句检查变量的类型encode()
。
def encode(string): if isinstance(string, str): encoded = string.encode('utf-8') return encoded else: return string result = encode('bobbyhadz.com') print(result) # 👉️ b'bobbyhadz.com' result = encode(b'bobbyhadz.com') print(result) # 👉️ b'bobbyhadz.com'
该if
语句检查提供的值是否具有字符串类型。
如果值是字符串,我们调用encode()
将字符串转换为字节的方法。
否则,我们按原样返回值。
使用str.encode()
对比bytes.decode()
您可以使用str.encode()
go from str
tobytes
和
bytes.decode()
to go from bytes
to 的方法str
。
my_text = 'bobbyhadz.com' my_binary_data = my_text.encode('utf-8') print(my_binary_data) # 👉️ b'bobbyhadz.com' my_text_again = my_binary_data.decode('utf-8') print(my_text_again) # 👉️ 'bobbyhadz.com'
str.encode ()方法与Unicode 字符串相反bytes.decode()
,它返回以请求的编码编码的 Unicode 字符串的表示形式。bytes
使用bytes()
和str()
类代替
您也可以使用bytes(s, encoding=...)
和str(b, encoding=...)
。
my_text = 'bobbyhadz.com' my_binary_data = bytes(my_text, encoding='utf-8') print(my_binary_data) # 👉️ b'bobbyhadz.com' my_text_again = str(my_binary_data, encoding='utf-8') print(my_text_again) # 👉️ 'bobbyhadz.com'
str类返回给定对象的字符串版本。如果未提供对象,则该类返回一个空字符串。
使用
bytes类的语法是相同的,只是b
添加了一个前缀。
Python 3 使用文本和二进制数据的概念
自 Python 3 以来,该语言使用文本和二进制数据的概念,而不是 Unicode 字符串和 8 位字符串。
Python 中的所有文本都是 Unicode,但是,编码的 Unicode 表示为二进制数据。
您可以使用str
类型来存储文本,bytes
使用类型来存储二进制数据。
u'...'
Unicode 文本使用文字,因为所有字符串现在都是 Unicode。但是,您必须b'...'
对二进制数据使用文字。
开始调试的一个好方法是print(dir(your_object))
查看字符串具有哪些属性。
检查变量存储的类型
如果您不确定变量存储的类型,请使用该类type()
。
my_str = 'bobbyhadz.com' print(type(my_str)) # 👉️ <class 'str'> print(isinstance(my_str, str)) # 👉️ True my_bytes = b'bobbyhadz.com' print(type(my_bytes)) # 👉️ <class 'bytes'> print(isinstance(my_bytes, bytes)) # 👉️ True
类型
类
返回对象的类型。
如果传入的对象是传入类的实例或子类,则isinstance函数返回
。True
bytes
打印对象的属性
这是打印对象属性的示例bytes
。
my_bytes = b'bobbyhadz.com' # ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'center', 'count', 'decode', 'endswith', 'expandtabs', 'find', 'fromhex', 'hex', 'index', 'isalnum', 'isalpha', 'isascii', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'removeprefix', 'removesuffix', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] print(dir(my_bytes))
如果将一个类传递给dir()
函数,它会返回该类属性的名称列表,并递归地返回其基类的属性。
由于encode()
不是bytes对象实现的方法,所以报错。