Reading from Python dict if key might not be present

Viewed 63247

I am very new to Python and parsing data.

I can pull an external JSON feed into a Python dictionary and iterate over the dictionary.

for r in results:
     print r['key_name']

As I walk through the results returned, I am getting an error when a key does not have a value (a value may not always exist for a record). If I print the results, it shows as

'key_name': None, 'next_key':.................

My code breaks on the error. How can I control for a key not having a value?

Any help will be greatly appreciated!

Brock

8 Answers

The preferred way, when applicable:

for r in results:
     print r.get('key_name')

this will simply print None if key_name is not a key in the dictionary. You can also have a different default value, just pass it as the second argument:

for r in results:
     print r.get('key_name', 'Missing: key_name')

If you want to do something different than using a default value (say, skip the printing completely when the key is absent), then you need a bit more structure, i.e., either:

for r in results:
    if 'key_name' in r:
        print r['key_name']

or

for r in results:
    try: print r['key_name']
    except KeyError: pass

the second one can be faster (if it's reasonably rare than a key is missing), but the first one appears to be more natural for many people.

If possible, use the simplejson library for managing JSON data.

the initial question in this thread is why I wrote the Dictor library, it handles JSON fallback and None values gracefully without needing try/except or If blocks.

Also gives you additional options like ignore upper/lower case,

see,

https://github.com/perfecto25/dictor

use has_key() , and that will return true or false

[Updated to remove careless mistake]

You could also do something like this:

for r in (row for row in results if 'a' in row):
    print r['a']

This uses a generator expression to pick "rows" out of "results" where "row" includes the key "a".

Here's a little test script:

results = [{'a':True}, {'b':True}, {'a':True}]
for r in (row for row in results if 'a' in row): print r['a']
Related