使用python

时间:2018-07-02 23:35:34

标签: python json

我正在尝试使用python脚本读取和写入json文件(我已将此python块嵌入外壳脚本中)

test.json

{
  "environments": ["dev", "qa", "load", "prod"],
  "region": ["asia", "europe", "americas", "asia-pacific"],
  "product": ["mobile", "internet", "kiosk", "branch"],
  "ID": ["mobile:111", "internet:222", "kiosk:333", "branch:444"]
}

我想添加region(uk),然后再检查并添加它是否在列表中不可用。 以下是我的python代码,可以更新该值

reg_val="uk"

a_dict = {}
try:
    with open('test.json') as data_file:
        data = json.load(data_file)
        temp_list = []
        for dicObj in data["region"]:
            temp_list.append(dicObj)
        temp_list.append(reg_val)
        data["region"] = temp_list
        a_dict["region"] = data["region"]
        with open('test.json','w') as f:
            f.write(json.dumps(a_dict, indent=4, sort_keys=True, encoding="utf-8"))
except IOError as io:
    print "ERROR: ", io

我能够更新json文件,但是它删除了其他列表。我看到的输出是

{
    "region": [
        "asia", 
        "europe", 
        "americas", 
        "asia-pacific", 
        "uk"
    ]
}

3 个答案:

答案 0 :(得分:6)

只需保持简单即可,并且仅在reg_val运算符存在in时追加。然后,您可以转储到另一个文件。

import json

reg_val = "uk"

with open('test.json') as in_file, open('out.json', 'w') as out_file:
    data = json.load(in_file)
    if reg_val not in data['region']:
        data['region'].append(reg_val)

    json.dump(data, out_file, indent=4, sort_keys=True)

其中给出以下 out.json

{
    "ID": [
        "mobile:111",
        "internet:222",
        "kiosk:333",
        "branch:444"
    ],
    "environments": [
        "dev",
        "qa",
        "load",
        "prod"
    ],
    "product": [
        "mobile",
        "internet",
        "kiosk",
        "branch"
    ],
    "region": [
        "asia",
        "europe",
        "americas",
        "asia-pacific",
        "uk"
    ]
}

答案 1 :(得分:4)

这是因为您正在将console.log('end')写入文件,该文件被初始化为空的a_dict,然后仅插入dict

我有一些代码可以提供示例,但是RoadRunner击败了我(嘿,他的速度非常快!)。您还需要注意文件处理,因为您在打开READ文件处理程序的同时打开了WRITE文件处理程序-这很危险。

答案 2 :(得分:3)

其他列表被删除的原因是因为您使用的是写模式而不是附加模式。重新打开test.json文件时,使用代码open('test.json', 'a')附加到test.json,而不会覆盖您先前编写的内容。

编辑:如评论中所述,不适合附加到json文件。而是将所有内容都写入一个转储中。我推荐RoadRunner的方法。