【问题标题】:从 JSON 文件中删除特定数据
【发布时间】:2022-01-23 14:08:12
【问题描述】:

想法:
应该加载一个 JSON 文件,并删除对象 2-uID 及其子项。编辑后的内容应该保存在同一个 JSON 文件中。

问题:
我已经尝试了几种方法,例如this one from an SO user,但还没有对我有用。
显示的代码不会删除任何内容,而是将内容全部推送到一行中。

当前代码
Python代码:

import json

with open("path/to/json") as data_file:
    data = json.load(data_file)

for element in data:
    if '2-uID' in element:
        del element['2-uID']

with open("path/to/json", 'w') as data_file:
    data = json.dump(data, data_file)

JSON 文件:

    {
    "uID": {
        "1-uID": {
            "username": "1-username",
            "pinned": true
        },
        "2-uID": {
            "username": "2-username",
            "pinned": false
        },
        "3-uID": {
            "username": "3-username",
            "pinned": false
        }
    }
}

这是处理后 JSON 文件的样子:

    {
    "uID": {
        "1-uID": {
            "username": "1-username",
            "pinned": true
        },
        "3-uID": {
            "username": "3-username",
            "pinned": false
        }
    }
}

【问题讨论】:

  • 一旦一个 JSON 格式的数据被 python 读取,它被存储为一个字典/列表的列表。对于您的情况,您可以使用 pop() 删除特定密钥。见stackoverflow.com/questions/11277432/…。您的示例仅删除密钥的副本,而不是从实际的字典/列表列表中删除。

标签: python json python-3.x file


【解决方案1】:

编辑:

这是你的问题:

for element in data:
    if '2-uID' in element:
        del element['2-uID']

data 是顶级元素,所以它只有一个键:“uID”。尝试打印出“元素”:)


也许我误解了你,但你不应该只使用del 吗?

这对我有用

# string holding the JSON object
s = r"""{
    "uID": {
        "1-uID": {
            "username": "1-username",
            "pinned": true
        },
        "2-uID": {
            "username": "2-username",
            "pinned": false
        },
        "3-uID": {
            "username": "3-username",
            "pinned": false
        }
    }
}"""

import json

j = json.loads(s)

# remove one of the elements
del j["uID"]["2-uID"]

# see that the element is now gone
print(j)

# output:
# {'uID': {'2-uID': {'pinned': False, 'username': '2-username'},
#          '3-uID': {'pinned': False, 'username': '3-username'}}}

【讨论】:

  • 以某种方式完成它的工作 - 但是(与 JSON 文件相关)内容写在先前的内容下。所以我仍然有带有 2-uID 的旧内容,另外在同一个文件中还有没有 2-uID 的新内容。
  • 那么你需要检查你是如何存储到磁盘的。您是否可能以“追加”模式打开文件?我感觉您发布的代码是您实际代码的简化,不是吗?
  • 没错,实际代码要大得多。但是,问题是指也应该独立运行的特定功能。我用 r+ 打开文件,所以问题不应该来自那个
  • 呃,没关系,我能够解决导出问题。我忘了使用“json.dump(j, delObj)”和“with open(path, "w") as jsonFile:”。
  • @JueK3y 很高兴您找到了解决方案 :) 如果两件事同时“错误”,诊断问题可能非常困难!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多