我不能以正确的方式将我的python数据附加到JSON,我已经尝试了很多解决方案,但没有任何工作可以让我得到最终结果。我想使用python创建一个注册表单当数据输入时它被输入到json文件中,像这样
{
"User_Data":[
"user_no_1":{
"First_name":first_name
"second_name":second_name
"last_name":last_name
},
"user_no_2":{
"First_name":first_name
"second_name":second_name
"last_name":last_name
},
"user_no_3":{
"First_name":first_name
"second_name":second_name
"last_name":last_name
}
]
}
但是当我运行这个python代码时:
import json
jsonFile_read_user_data = open("test.json", "r")
data = json.load(jsonFile_read_user_data)
first_name = input('Please enter your first name:')
second_name = input('Please enter your second name:')
last_name = input('Please enter your first name:')
data_inputed = {"user_no_1": {"first_name": first_name, "second_name": second_name, "last_name": last_name}}
data["USER_DATA"].append(data_inputed)
jsonFile_write_user_data = open("test.json", "w")
str = json.dump(data, jsonFile_write_user_data, indent = 4)
jsonFile_write_user_data.seek(0)
这是我的数据出现在test.json:
{
"USER_DATA": [
{
"user_no_1": {
"first_name": "yassin",
"second_name": "ahmed",
"last_name": "rakha"
}
},
{
"user_no_2": {
"first_name": "jhon",
"second_name": "doe",
"last_name": "escobar"
}
},
{
"user_no_3": {
"first_name": "elon",
"second_name": "musk",
"last_name": "rakha"
}
}
]
}
所有我想要的是有第一个例子显示,但在我的测试。Json文件,我不知道这是一个问题,在我的python代码,而试图追加或Json文件中的问题。
您提供的代码中有几个拼写错误可能会导致问题:
- 原始格式是而不是一个JSON字符串——它真的没有任何意义。您的文件试图表示类似
Dict[str, List[str, Dict[str, Dict[str, str]]]]
类型的对象,该对象不存在(并且缺少一些逗号)。我建议去掉多余的外键"user_data"。(因为它是一个单例键,它没有目的)而是创建一个类型为Dict[str, Dict[str, str]]
的对象,并添加逗号并使所有内容都小写以使其标准化,像这样:
{"user_no_1": { "first_name":"James", "middle_name": "Herbert", "last_name":"Bond"}, ...}
- 简化你的代码,使它匹配这个新的数据类型(注意
dict
没有append
方法)
使用with
和一些字典理解,我们得到:
with open("test.json", 'r+') as user_data_file:
data = json.load(user_data_file)
names = {f'{x}_name': input(f'Please enter your {x} name: ') for x in ['first', 'second', 'last']}
data.update({'user_no_1': names}) # The |= is more concise, but only available with Python 3.9
json.dump(data, user_data_file, indent=4)
user_data_file.seek(0) # not really necessary, but I'll leave it in