Skip to main content

How to Resolve "TypeError: string argument without an encoding" in Python

The TypeError: string argument without an encoding is a common Python error that occurs when you try to create a bytes or bytearray object directly from a string without specifying how to encode that string into bytes.

This guide explains why this error happens and shows the correct ways to convert strings to bytes.

Understanding the Error: Text vs. Bytes

Python 3 makes a clear distinction between text (represented by str objects, which are sequences of Unicode characters) and binary data (represented by bytes or bytearray objects, which are sequences of bytes).

To convert text (str) into binary data (bytes), Python needs to know how to represent each character as a sequence of bytes. This process is called encoding, and different encodings exist (like UTF-8, ASCII, Latin-1).

The bytes() and bytearray() constructors raise the TypeError when you give them a string without telling them which encoding to use:

# These lines cause the error:
# print(bytes('hello')) # ⛔️ TypeError: string argument without an encoding
# print(bytearray('hello')) # ⛔️ TypeError: string argument without an encoding

The direct solution is to provide the desired encoding (usually 'utf-8') as the second argument to the bytes() or bytearray() constructor:

# Correctly creating bytes
print(bytes('hello', encoding='utf-8')) # Output: b'hello'
print(bytes('hello', 'utf-8')) # Positional argument also works

# Correctly creating bytearray
print(bytearray('hello', encoding='utf-8')) # Output: bytearray(b'hello')
print(bytearray('hello', 'utf-8')) # Positional argument also works
  • Specifying encoding='utf-8' explicitly tells Python how to convert the string characters into bytes. Using the keyword argument encoding= is generally more readable.

A more common and often preferred way to convert a string to bytes is to use the string's .encode() method:

my_str = 'hello'

my_bytes = my_str.encode('utf-8') # Specify the encoding

print(my_bytes) # Output: b'hello'
print(type(my_bytes)) # Output: <class 'bytes'>

# You can often omit 'utf-8' as it's the default in many cases:
my_bytes_default = my_str.encode()
print(my_bytes_default) # Output: b'hello'
  • .encode() is a method directly available on string objects, making the conversion explicit and often clearer in context.

Converting Bytes Back to Strings with decode()

To convert a bytes object back to a str, use the .decode() method, specifying the same encoding that was used to create the bytes:

my_str = 'hello'
my_bytes = my_str.encode('utf-8') # Encode str -> bytes

my_str_again = my_bytes.decode('utf-8') # Decode bytes -> str
print(my_str_again) # Output: 'hello'
  • Encoding converts str to bytes.
  • Decoding converts bytes to str.

Conclusion

The TypeError: string argument without an encoding arises from the fundamental difference between text (str) and binary data (bytes) in Python 3.

To resolve it, you must explicitly specify an encoding when converting a string to bytes. The recommended methods are:

  • Providing the encoding argument to bytes() or bytearray() (e.g., bytes(my_str, encoding='utf-8')).
  • Using the string's .encode() method (e.g., my_str.encode('utf-8')).

Always be mindful of the encoding you're using, especially when dealing with data from external sources or different systems. UTF-8 is the most common and generally recommended encoding for text.