[英]python: read json data from file and append more data
我正在尝试从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)
正如jsonLint指出的那样 ,data.json中的新数据无效。 我究竟做错了什么? 这是新数据
{
"Config1": {
"TestCase1": {
"Data1": 200,
"Data2": 2715
}
},
"Config2": {
"TestCase1": {
"Data1": 2710,
"Data2": 2715
}
}
} {
"Config1": {
"TestCase2": {
"Data1": 2600,
"Data2": 2900
}
},
"Config2": {
"TestCase2": {
"Data1": 2600,
"Data2": 2900
}
}
}
问题是您要在此处将新的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解析器都期望有一个对象。
除了以错误的模式(应为“ w”)打开文件之外,您还通过定义新的dict内联覆盖了旧的“ config”树。
代替:
result.update({config:{test:{'Data1':2600,'Data2':2900}}})
尝试这个:
result[config][test] = {'Data1': 2600, 'Data2': 2900}
这样可以为您的示例提供所需的结果。 添加TestCase2时,它将使result['Config1']['TestCase1']
保持result['Config1']['TestCase1']
。 您可能还需要通过将result[config]
设置为{}
如果它为None
来确保配置树存在。
主要问题是,如果dict2
存在dict1.update(dict2)
方法, dict1
覆盖dict1
键,因此文件中的第二个对象没有key => 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(...
而不是result.update({config:...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.