AttributeError: ‘bytes’ 对象没有属性 ‘encode’

AttributeError: ‘bytes’ 对象没有属性 ‘encode’

AttributeError: ‘bytes’ object has no attribute ‘encode’

encode()当我们在字节对象上调用方法时,会出现 Python“AttributeError: ‘bytes’ object has no attribute ‘encode’” 。

要解决该错误,请删除对该方法的调用,encode()因为该变量已经存储了一个字节对象。

attributeerror bytes 对象没有属性编码

下面是错误如何发生的示例。

主程序
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 bytesstring

你不必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 bytesstring

在调用 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 strtobytes
bytes.decode()to go from bytesto 的方法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使用类型来存储二进制数据。

在 Python 3 中,您不能再对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()
函数,它会返回该类属性的名称列表,并递归地返回其基类的属性。

如果您尝试访问不在此列表中的任何属性,您将收到“AttributeError:bytes object has no attribute error”。

由于encode()不是bytes对象实现的方法,所以报错。