✋ Update: This post was originally published on my blog decodingweb.dev, where you can read the latest version for a 💯 user experience. ~reza
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.
Encoding and Decoding in Python 3
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:
Top comments (0)