将数据添加到现有 JSON 文件而不覆盖它

Posted

技术标签:

【中文标题】将数据添加到现有 JSON 文件而不覆盖它【英文标题】:Adding data to an existing JSON file without overwriting it 【发布时间】:2022-01-22 18:42:26 【问题描述】:

想法: 我想将 JSON 对象添加到现有 JSON 文件,但不覆盖文件中的现有数据。 uid-003 对象应该在现有的 uid-xxx 条目之后从属于 uID

问题: 没有任何解决方案可以正常工作。 append() 方法也返回错误:AttributeError: 'dict' object has no attribute 'append'

当前代码 Python代码:

user = 
    "uid-003": 
        "username": "username-3",
        "pinned": "pinned",
        "created": 
            "date": "DD/MM/YYYY",
            "time": "HH:MM:SS"
        ,
        "verified": 
            "checked": False
        
    


with open("path/to/json", "r+") as file:
    data = json.load(file)
    
    temp = data['uID']
    temp.append(user)

    json.dump(data, file)

JSON 文件:


    "uID": 
        "uid-001": 
            "username": "username-1",
            "pinned": false,
            "created": 
                "date": "20-12-2021",
                "time": "21:13:39"
            ,
            "verified": 
                "checked": false
            
        ,
        "uid-002": 
            "username": "username-2",
            "pinned": true,
            "created": 
                "date": "20-12-2021",
                "time": "21:13:39"
            ,
            "verified": 
                "checked": false
            
        
    

【问题讨论】:

【参考方案1】:

您需要做的就是将您的 user 字典添加到现有的 'uID' 键中。如果您更新已使用 r+ 打开的文件并且您正在增加文件中的数据量,则您需要在写入之前寻找开头。这应该会有所帮助:

import json

THE_FILE = 'the_file.json'

user = 
    "uid-003": 
        "username": "username-3",
        "pinned": "pinned",
        "created": 
            "date": "DD/MM/YYYY",
            "time": "HH:MM:SS"
        ,
        "verified": 
            "checked": False
        
    


with open(THE_FILE, 'r+') as jfile:
    j = json.load(jfile)
    for k, v in user.items():
        j['uID'][k] = v
    jfile.seek(0)
    json.dump(j, jfile, indent=4)

注意:在这种情况下,对 user.items() 的迭代并不是真正需要的,但它可以说明当 user 包含更多字典时如何使用此模式不仅仅是您示例中的那个

【讨论】:

满足我所需要的一切。非常感谢!【参考方案2】:

AttributeError: 'dict' 对象没有属性 'append' 块引用

这是非常明确的,您试图在对象中附加一个元素,因为它是一个列表。

您需要做的是将您的 uID 从 obj 转换为列表。如果您以后需要操作此对象,它将简化您的生活

另一种方式是:

user = 
    "uid-003": 
        "username": "username-3",
        "pinned": "pinned",
        "created": 
            "date": "DD/MM/YYYY",
            "time": "HH:MM:SS"
        ,
        "verified": 
            "checked": False
        
    


with open("path/to/json", "r+") as file:
    data = json.load(file)
    keys = user.keys()
    data['uID'][keys[0]] = user[0]

    json.dump(data, file)

【讨论】:

【参考方案3】:

AttributeError: 'dict' 对象没有属性 'append'

您可以使用dict update

import json

with open('file.json', 'r+') as file:
    data = json.load(file)
    data['uID'].update(user)
    file.seek(0)
    json.dump(data, file, indent=4)

【讨论】:

以上是关于将数据添加到现有 JSON 文件而不覆盖它的主要内容,如果未能解决你的问题,请参考以下文章

将对象添加到数组而不覆盖

如何使用 PlistBuddy 添加设置而不覆盖现有设置?

如何在索引 2 处向 pandas 数据帧添加额外的行而不覆盖现有索引

如何通过本机反应将新字段数据更新到现有文档而不覆盖firebase-9中的现有数据

在 Fortran 中写入现有文件而不覆盖

添加具有特定ID的文档而不覆盖现有ID