python:从文件中读取json数据并附加更多数据

时间:2016-04-09 02:41:19

标签: python json

我试图从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
            }
        }
    }

3 个答案:

答案 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(...