【问题标题】:Changing multiple keys on a JSON FILe using Python使用 Python 更改 JSON 文件上的多个键
【发布时间】:2019-07-23 17:37:26
【问题描述】:

如果满足条件,我正在尝试将新密钥更新到我的 JSON 文件中。以下是我尝试在 JSON 文件中进行多次更新的 python 代码。

 #!/usr/bin/env python
 # Usage: update json file 
import json
import os

json_dir="/opt/rdm/adggeth/ADGG-ETH-02/20181008/"
json_dir_processed="/opt/rdm/adggeth/ADGG-ETH-02/20181008updated/"
for json_file in os.listdir(json_dir):
    if json_file.endswith(".json"):
        processed_json = "%s%s" % (json_dir_processed, json_file)
        json_file = json_dir + json_file
        print "Processing %s -> %s" % (json_file, processed_json)
        with open(json_file, 'r') as f:
            json_data = json.load(f)
            # replacement mapping
            update_map = {"grp_farmerreg/farmerdetails/farmermobile":"grp_farmerdts/hh_id",
                          "grp_farmerdts/hh_region":"grp_farmerdts/region",
                          "grp_farmerdts/hh_district":"grp_farmerdts/district",
                          "grp_farmerdts/hh_ward":"grp_farmerdts/ward",
                          "grp_farmerdts/hh_village":"grp_farmerdts/village"}

            diff_keys = update_map.keys() - json_data.keys()
            if not diff_keys:
                print("No Update to JSON keys")
            else:
                for k in diff_keys:
                    json_data[k] = json_data[update_map[k]]
        with open(processed_json, 'w') as f:
            f.write(json.dumps(json_data, indent=4))
    else:
        print "%s not a JSON file" % json_file

我尝试更新的 JSON 文件如下:

{
    ....
    "farmerregistrd": "1", 
    "grp_farmerdts/region": "5", 
    "datacollid": "0923678275", 
    "_status": "submitted_via_web", 
    "enumtype": "2", 
    "deviceid": "352948096845916", 
    "start_time": "2019-04-03T10:57:23.620+03", 
    "_uuid": "f1069eae-33f8-4850-a549-49fcde27f077", 
    "grp_farmerdts/village": "2852", 
    "_submitted_by": null, 
    "formhub/uuid": "42cb3fc351a74fd89702078160f849ca", 
    "grp_farmerdts/hh_id": "623", 
    "grp_farmerdts/ward": "136", 
    ...
    "_userform_id": "adggeth_ADGG-ETH-REG02-20181008", 
    "_id": 711097, 
    "grp_farmerdts/district": "31"
} 

运行以下 python 文件的预期输出如下

 {
        ....
        "farmerregistrd": "1", 
        "grp_farmerdts/hh_region": "5", 
        "datacollid": "0923678275", 
        "_status": "submitted_via_web", 
        "enumtype": "2", 
        "deviceid": "352948096845916", 
        "start_time": "2019-04-03T10:57:23.620+03", 
        "_uuid": "f1069eae-33f8-4850-a549-49fcde27f077", 
        "grp_farmerdts/hh_village": "2852", 
        "_submitted_by": null, 
        "formhub/uuid": "42cb3fc351a74fd89702078160f849ca", 
        "grp_farmerdts/hh_id": "623", 
        "grp_farmerdts/hh_ward": "136", 
        ...
        "_userform_id": "adggeth_ADGG-ETH-REG02-20181008", 
        "_id": 711097, 
        "grp_farmerdts/hh_district": "31"
    } 

【问题讨论】:

标签: python json


【解决方案1】:

使用re 模块和json.loads()object_hook= 参数(doc)。此脚本将为每个 grp_farmerdts/* 键添加 hh_ 前缀,其中不是:

json_str = '''{
    "farmerregistrd": "1",
    "grp_farmerdts/region": "5",
    "datacollid": "0923678275",
    "_status": "submitted_via_web",
    "enumtype": "2",
    "deviceid": "352948096845916",
    "start_time": "2019-04-03T10:57:23.620+03",
    "_uuid": "f1069eae-33f8-4850-a549-49fcde27f077",
    "grp_farmerdts/village": "2852",
    "_submitted_by": null,
    "formhub/uuid": "42cb3fc351a74fd89702078160f849ca",
    "grp_farmerdts/hh_id": "623",
    "grp_farmerdts/ward": "136",
    "_userform_id": "adggeth_ADGG-ETH-REG02-20181008",
    "_id": 711097,
    "grp_farmerdts/district": "31"
}'''

import re
import json

def change_keys(d):
    return {re.sub(r'grp_farmerdts/((?!hh_)(\w+))', r'grp_farmerdts/hh_\1', k): v for k, v in d.items()}

print(json.dumps(json.loads(json_str, object_hook=change_keys), indent=4))

打印:

{
    "farmerregistrd": "1",
    "grp_farmerdts/hh_region": "5",
    "datacollid": "0923678275",
    "_status": "submitted_via_web",
    "enumtype": "2",
    "deviceid": "352948096845916",
    "start_time": "2019-04-03T10:57:23.620+03",
    "_uuid": "f1069eae-33f8-4850-a549-49fcde27f077",
    "grp_farmerdts/hh_village": "2852",
    "_submitted_by": null,
    "formhub/uuid": "42cb3fc351a74fd89702078160f849ca",
    "grp_farmerdts/hh_id": "623",
    "grp_farmerdts/hh_ward": "136",
    "_userform_id": "adggeth_ADGG-ETH-REG02-20181008",
    "_id": 711097,
    "grp_farmerdts/hh_district": "31"
}

【讨论】:

  • 如何将其应用于文件夹中的多个 JSON 文件
  • @MirieriMogaka 使用 json.load(<file object>, object_hook=change_keys) 解析 json 并更改密钥。他们可以使用file.writejson.dumps 保存对象,或者简单地使用json.dump(<file object)
【解决方案2】:

根据您的预期输出,需要检查所有特定键(不是其中之一)。改变你的逻辑,如下所示:

...
json_data = json.load(f)
# replacement mapping
update_map = {"grp_farmerreg/farmerdetails/farmermobile":"grp_farmerdts/hh_id",
              "grp_farmerdts/hh_region":"grp_farmerdts/region",
              "grp_farmerdts/hh_district":"grp_farmerdts/district",
              "grp_farmerdts/hh_ward":"grp_farmerdts/ward", "grp_farmerdts/hh_village":"grp_farmerdts/village"}

diff_keys = update_map.keys() - json_data.keys()
if not diff_keys:
    print("No Update to JSON keys")
else:
    for k in diff_keys:
        if update_map[k] in json_data:
            json_data[k] = json_data[update_map[k]]

【讨论】:

  • Traceback(最近一次调用最后一次):文件“/opt/rdm/adggeth/ADGG-ETH-02/addfidkey.sh”,第 40 行,在 diff_keys = update_map.keys() - json_data.keys() TypeError: unsupported operand type(s) for -: 'list' and 'list' #这是我在运行代码后遇到的错误@RomanPerekhrest
  • @MirieriMogaka。这意味着您以错误的方式使用了我的代码。 json_dataupdate_map 是字典。认真使用建议的代码
  • @MirieriMogaka,你的 Python 版本是多少?
  • 我已经复制了我的更改
  • python 版本 2.7.6
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
相关资源
最近更新 更多