【问题标题】:Write json file using python [duplicate]使用python编写json文件[重复]
【发布时间】:2018-07-02 23:35:33
【问题描述】:

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

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"]
}

我正在尝试添加地区(英国),在此之前我想检查并添加它是否在列表中不可用。 下面是我的 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"
    ]
}

【问题讨论】:

  • 为什么不把data写回文件而不是a_dict,这是一个只包含区域的新字典。

标签: python json


【解决方案1】:

保持简单,仅在 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"
    ]
}

【讨论】:

  • Meep Meep,你很快!
【解决方案2】:

这是因为你正在将a_dict写入文件,该文件被初始化为一个空的dict,然后只插入了data["region"]

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

【讨论】:

    【解决方案3】:

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

    编辑:如 cmets 中所述,不适合附加到 json 文件。相反,将所有内容都写在一个转储中。我推荐 RoadRunner 的方法。

    【讨论】:

    • 但这将附加列表的 json 表示形式,包括外部大括号 ({)。这将在以后导致错误。
    • 好点,我会编辑我的帖子来提及这一点。
    • 我打算建议跟踪有问题的行,然后重新编写整个内容(包括)该行,但@RoadRunner 也击败了我
    猜你喜欢
    • 2016-08-11
    • 2016-12-07
    • 2018-01-25
    • 2019-02-23
    • 2013-04-22
    • 1970-01-01
    • 2012-08-28
    • 2016-02-15
    • 1970-01-01
    相关资源
    最近更新 更多