首页 > 解决方案 > 如何删除 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)

因此,例如,如果 name == "Two",那么所有 Two 的键值对都将被删除,包括 Two 本身。

标签: pythonjson

解决方案


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

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

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


推荐阅读