If you’re getting the “AttributeError: ‘str’ object has no attribute ‘decode’ error, you’re probably calling
decode() on a string value (
str object) in Python 3.
Here’s what the error message looks like in the Python shell:
>>> username = 'admin' >>> username.decode() Traceback (most recent call last): File "", line 1, in AttributeError: 'str' object has no attribute 'decode'. Did you mean: 'encode'? >>>
Python 3 stores a string as a sequence of Unicode code points and hence there's no need to decode them.
str class doesn't even implement the
decode() method. If you call this method on a Python 3 string, you'll get the infamous "AttributeError: 'str' object has no attribute 'decode'" error.
Let's confirm it by using the
username = 'admin' hasattr(username, 'decode') # False
As you can see, the
hasattr() function returns
False in this case.
It wasn't the case with Python 2, though. In Python 2, you can store strings as:
- 8-bit strings (by default)
- Unicode objects - by using the
uprefix before a string literal (e.g.,
u'somestring') or by using the unicode constructor (
In Python 2, strings expose a
decode() function. In Python 3, however, you don't have to decode your strings as all string values are assumed to be in Unicode.
In Python 3, you can only call the
decode() method on a
bytes object - when you want to decode it into a Unicode string.
In the Python 3 context:
- Encoding is the process of converting a
strobject to a
- Decoding is the process of converting a
bytesobject to a
strobject based on the specified encoding.
encode() on a string returns a
username = 'admin' username_encoded = username.encode() print(type(username_encoded)) # <class 'bytes'> print(hasattr(username_encoded, 'decode')) # True print(username_encoded) # b'admin'
If you're working with a legacy code and have no control over the value (whether it's a
str object), you can use a try/catch block to avoid a possible attribute error.
try: username_decoded = username.decode('UTF-8') # Do something here except AttributeError: pass
But as mentioned earlier, you don't usually need to decode your Python string to Unicode as it already is.
And that's how you fix the "AttributeError: 'str' object has no attribute 'decode'" error in Python 3.
I hope that solves your problem. Thanks for reading.
❤️ You might like: