如何删除json文件中的键及其嵌套键值对?

时间:2019-05-31 13:45:40

标签: python json

我希望能够检查json文件是否具有我正在寻找的顶级密钥并删除该嵌套字典。

Json文件:

{
    "One": {
        "action": "One",
        "delay": 1559243024.3665395,
        "seconds": 0,
        "score": 0,
        "delta": 1559183024.3665395,
        "grace_sec": 60000
    },
    "Two": {
        "action": "Two",
        "delay": 1559321009.969849,
        "seconds": 0,
        "score": 14,
        "delta": 1559261009.969849,
        "grace_sec": 60000
    },
    "Three": {
        "action": "Three",
        "delay": 1559909745.5981774,
        "seconds": 0,
        "score": 0,
        "delta": 1559309745.5981774,
        "grace_sec": 600000
    },
    "Four": {
        "action": "Four",
        "delay": 1559909757.0363235,
        "seconds": 0,
        "score": 1,
        "delta": 1559309757.0363235,
        "grace_sec": 600000
    }
}

这是我尝试过的但没有成功的方法:

if name == child.text:
              ...
                with open("streak.json", "r+") as f:
                    data = json.load(f)

                for x in data:
                    if name in x:
                        del x[name]

                with open("streak.json", "w") as file:
                    data = json.dump(data, file)

例如,如果名称==“ Two”,则将删除Two的所有键值对,包括Two本身。

3 个答案:

答案 0 :(得分:3)

您可以使用pop()功能。此函数将从字典中删除键并返回值。如果密钥不存在,它将返回默认值。 例如:

>>> d = {'a': 1, 'b': 2}
>>> d.pop('a', None)
1
>>> d
{'b': 2}
>>> d.pop('c', None)
>>> d
{'b': 2}
>>>

这将减少删除密钥时检查密钥是否存在的负担,并且您不必依靠KeyError来检查密钥是否失败。 您可以检查返回值是否不是您的前哨值,在这种情况下为None,则密钥已成功删除。如果它是前哨值,那么密钥就永远不存在。

答案 1 :(得分:0)

只需删除顶级项目:

with open("streak.json", "r") as f:
    data = json.load(f)

if name in data:
    del data[name]

with open("streak.json", "w") as file:
    json.dump(data, file)

答案 2 :(得分:0)

您只需要取出for循环,因为这将在字典键上进行迭代。因此,for x in data会给您'One''Two'等。因此,在匹配'Two'时,您将尝试del 'Two'['Two'],但这没有任何意义。您可以使用in

在字典中查找这些键
...
with open("streak.json", "r") as f:
    data = json.load(f)

    if name in data:
        del data[name]