Explain Codes LogoExplain Codes Logo

Why am I seeing "TypeError: string indices must be integers"?

python
json-parsing
data-types
error-handling
Alex KataevbyAlex Kataev·Dec 29, 2024
TLDR

The error TypeError: string indices must be integers is Python's polite way of saying you're trying to access a string with a non-integer index, like a string or an object. It prefers integer indices to engage with individual characters within a string:

s = "abc" print(s[1]) # Python is happy since 1 is an integer index, returns 'b'. # Did you notice Python starts counting from 0? ;)

Avoid stirring Python's temper by ensuring indices are non-negative and less than the length of the string.

Rapid-fix steps:

  • Make sure you're dealing with the right type of variable.
  • Not confusing strings as JSON-like objects?

Sneaky trap: Careful with the innocent looking comma in slice notation. Chop-chop with mystring[start:end] slicing, but sans the commas!

Mapping the error landscape

JSON drama

JSON data can be a deceptive master of disguise, often confused as a string when it's a list of dictionaries. Keep your eyes peeled for JSON structures and decode them using the json module like a seasoned code-breaker:

import json data = '{"name": "John", "age": 30}' decoded_data = json.loads(data) # John just hopped over to a Python dictionary.

Loop-de-loop with Python 3

For dictionaries afoot (courtesy of parsed JSON perhaps?), use .items() to pair up with key-value comrades in Python 3:

for key, value in decoded_data.items(): print(key, value) # Prints key-value pairs, no more single-party rule!

Remember, Python 3 ditched the old buddy iteritems() for items().

From JSON to CSV - a journey

Save some tears while translating JSON data to CSV format by remembering your data types. A JSON object (or our friend Python dictionary) is not a string, despite the crocodile tears. Let the csv module do the heavy lifting.

Spinning the data wheel with Pandas

Fond of Pandas? Use iterrows() for a merry-go-round on DataFrame objects. Each row takes a spin as a Series object, leaving strings behind.

Error messages a la carte

Clarifying error messages can be a boon. Fancy ones tip you off about the index types and expected types. Who doesn't love a well-articulated error? (Unexpected optimism, I know!).

Slice notation - the fine print

Remember to use colon : in slice notation when extracting substrings. A misplaced comma will hatch an unexpected type like a tuple, and we all know how devastating that can be.

Verifying data types

When in the trenches with JSON parsing or CSV conversion, data type validation is your trusty sidekick. Keep it close, and that TypeError won't dare come near.

Boundaries - mark your limits

Mind the boundaries of the string. Venturing beyond the string length or flirting with negative indices without caution can incite the wrath of the IndexError beast.

Code, but respectfully

Consider adding type checks and assertions to your code to catch errors before they catch you off guard. Python's isinstance() is your loyal checker in the game of types.