将数据添加到现有 JSON 文件而不覆盖它
Adding data to an existing JSON file without overwriting it
思路:
我想将 JSON 对象添加到现有 JSON 文件,但不覆盖文件中的现有数据。
uid-003
对象应从属于现有 uid-xxx
条目之后的 uID
。
问题:
没有任何一种解决方法能发挥应有的作用。 append()
方法也 returns 错误: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
}
}
}
}
您需要做的就是将 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() 上的迭代并不是真正必要的,但用于说明在 [=15= 时如何使用此模式]user 包含的词典比您示例中的词典多
AttributeError: 'dict' object has no attribute 'append'
Blockquote
这是非常明确的,您正在尝试将一个元素附加到对象中,因为它是一个列表。
您需要做的是将您的 uID 从 obj 转换为 as 列表。如果您以后需要操作此对象,它将简化您的生活
另一种方式是:
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)
AttributeError: 'dict' object has no attribute '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 对象添加到现有 JSON 文件,但不覆盖文件中的现有数据。
uid-003
对象应从属于现有 uid-xxx
条目之后的 uID
。
问题:
没有任何一种解决方法能发挥应有的作用。 append()
方法也 returns 错误: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
}
}
}
}
您需要做的就是将 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() 上的迭代并不是真正必要的,但用于说明在 [=15= 时如何使用此模式]user 包含的词典比您示例中的词典多
AttributeError: 'dict' object has no attribute 'append' Blockquote
这是非常明确的,您正在尝试将一个元素附加到对象中,因为它是一个列表。
您需要做的是将您的 uID 从 obj 转换为 as 列表。如果您以后需要操作此对象,它将简化您的生活
另一种方式是:
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)
AttributeError: 'dict' object has no attribute '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)