我试图从json文件中读取现有数据并尝试使用python将更多数据附加到文件中(我是一个python新手)。这是我在我的脚本中读到的data.json文件中的现有数据:
{
"Config1": {
"TestCase1": {
"Data1": 200,
"Data2": 2715
}
},
"Config2": {
"TestCase1": {
"Data1": 2710,
"Data2": 2715
}
}
}
阅读后我想附加TestCase2数据。这就是我正在做的事情:
with open("data.json") as json_file: #load existing data
json_data = json.load(json_file)
test='TestCase2'
result=json_data
myConfigs = ['Config1','Config2']
for each, config in enumerate(myConfigs):
result.update({config:{test:{'Data1':2600,'Data2':2900}}})
with open('data.json', 'a') as outfile:
json.dump(result, outfile)
data.json中的新数据无效,如jsonLint所示。我究竟做错了什么?这是新数据
{
"Config1": {
"TestCase1": {
"Data1": 200,
"Data2": 2715
}
},
"Config2": {
"TestCase1": {
"Data1": 2710,
"Data2": 2715
}
}
} {
"Config1": {
"TestCase2": {
"Data1": 2600,
"Data2": 2900
}
},
"Config2": {
"TestCase2": {
"Data1": 2600,
"Data2": 2900
}
}
}
答案 0 :(得分:2)
问题是您在此处将新JSON附加到原始JSON文件:
with open('data.json', 'a') as outfile:
json.dump(result, outfile)
所以你在同一个文件中有两个JSON对象:
...
"Data2": 2715
}
}
} { <--- original object ends here, new object starts here
"Config1": {
...
JSONLint需要一个对象,任何JSON解析器也是如此。
答案 1 :(得分:2)
除了以错误模式打开文件(应该是'w')之外,您还可以通过定义新的内联字典来覆盖旧的“配置”树。
而不是:
result.update({config:{test:{'Data1':2600,'Data2':2900}}})
试试这个:
result[config][test] = {'Data1': 2600, 'Data2': 2900}
这应该会为您提供您正在寻找的示例结果。添加TestCase2时会让result['Config1']['TestCase1']
保持不变。您可能还需要通过将result[config]
设置为{}
来确保配置树存在,如果它是None
。
答案 2 :(得分:0)
主要问题是dict1.update(dict2)
方法会覆盖dict1
密钥,如果dict2
中存在相同内容,那么您文件中的第二个对象就没有密钥=&gt; { {1}}
另一个问题是(如上所述)文件以错误的模式打开(应该是TestCase1
),因为w
附加到json文件
你可以试试这个:
a
只需with open("data.json") as json_file:
json_data = json.load(json_file)
test='TestCase2'
result=json_data
myConfigs = ['Config1','Config2']
for each, config in enumerate(myConfigs):
result[config].update({test:{'Data1':2600,'Data2':2900}})
with open('data.json', 'w') as outfile:
json.dump(result, outfile)
而不是result[config].update(...