【问题标题】:Adding data to an existing JSON file without overwriting it将数据添加到现有 JSON 文件而不覆盖它
【发布时间】: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
            }
        }
    }
}

【问题讨论】:

    标签: python json python-3.x file


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2015-04-29
        • 1970-01-01
        • 2021-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        • 1970-01-01
        • 2019-06-04
        相关资源
        最近更新 更多