Home > Mobile >  KeyError 0 when deleting JSON key with value
KeyError 0 when deleting JSON key with value

Time:02-04

I try to write script for deleting JSON fragment. Currently I stopped with deleting key and value. I get key error 0:

File "<stdin>", line 4, in <module>
KeyError: 0

I use json module and Python 2.7.

My sample json file is this:

"1": {
    "aaa": "234235",
    "bbb": "sfd",
    "date": "01.01.2022",
    "ccc": "456",
    "ddd": "dghgdehs"
},
"2": {
    "aaa": "544634436",
    "bbb": "rgdfhfdsh",
    "date": "01.01.2022",
    "ccc": "etw",
    "ddd": "sgedsry"
}

And faulty code is this:

import json

obj  = json.load(open("aaa.json"))

for i in xrange(len(obj)):
    if obj[i]["date"] == "01.01.2022":
        obj.pop(i)
        break

What I do wrong here?

CodePudding user response:

i will take on the integer values 0, 1, but your object is a dictionary with string keys "1", "2". So iterate over the keys instead, which is simply done like this:

for i in obj:
    if obj[i]["date"] == "01.01.2022":
        obj.pop(i)
        break

CodePudding user response:

In your loop, range yields integers, the first being 0. The is no integer as key in your json so this immediately raises a KeyError.

Instead, loop over obj.items() which yields key-value pairs. Since some of your entries are not dict themselves, you will need to be careful with accessing obj[i]['date'].

if isinstance(v, dict) and v.get("date") == "01.01.2022":
    obj.pop(k)
    break

CodePudding user response:

The way you're reading it in, obj is a dict. You're trying to access it as a list, with integer indices. This code:

for i in range(len(obj)):
    if obj[i]["date"] == "Your Date":
        ...

First calls obj[0]["date"], then obj[1]["date"], and so on. Since obj is not a list, 0 here is interpreted here as a key - and since obj doesn't have a key 0, you get a KeyError.

A better way to do this would be to iterate through the dict by keys and values:

for k, v in obj.items():
    if v["date"] == "your date":  # index using the value
        obj.pop(k)                # delete the key
  •  Tags:  
  • Related