About "‘str’ object has no attribute ‘decode’" error in Python

lavary

Reza Lavarian

Posted on February 5, 2023

About "‘str’ object has no attribute ‘decode’" error in Python

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'?
>>>
Enter fullscreen mode Exit fullscreen mode

Python 3 stores a string as a sequence of Unicode code points and hence there's no need to decode them.

The new 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 hasattr() function:

username = 'admin'
hasattr(username, 'decode') # False
Enter fullscreen mode Exit fullscreen mode

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 u prefix before a string literal (e.g., u'somestring') or by using the unicode constructor (unicode('somestring'))

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 str object to a bytes object
  • Decoding is the process of converting a bytes object to a str object based on the specified encoding.

Calling encode() on a string returns a bytes object:

username = 'admin'
username_encoded = username.encode()

print(type(username_encoded)) # <class 'bytes'>
print(hasattr(username_encoded, 'decode')) # True
print(username_encoded) # b'admin'
Enter fullscreen mode Exit fullscreen mode

If you're working with a legacy code and have no control over the value (whether it's a bytes or 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
Enter fullscreen mode Exit fullscreen mode

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:

💖 💪 🙅 🚩
lavary
Reza Lavarian

Posted on February 5, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related