繁体   English   中英

Python-如果键匹配,则从第二个文件替换JSON文件中的值

[英]Python - Replace value in JSON file from second file if keys match

我有两个看起来像这样的JSON文件

{"type": "FeatureCollection", "features": [{ "type": "Feature", "properties": { **"id"**: "Carlow", **"density"**: "0" } , "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -6.58901, 52.906464 ], [ -6.570265, 52.905682 ], [ -6.556207, 52.906464 ],

第二个JSON文件

{"features": [{"**count**": 2, "name": "**Sligo**"}, {"count": 3"name":"Fermanagh"},{"count": 1, "name": "Laois"}, 

我试图检查第一个文件中的“ id”是否与第二个文件中的“ name”匹配,如果是,则从第二个文件中将“ density”的值更改为“ count”的值。 我正在从一个类似的问题中使用递归,我在这里找到了替换键的JSON文件中的值可以嵌套n个级别的键,但是它仅检查一个键是否匹配并更改了值。 我需要两个键来匹配,然后再更改值。 这是我到目前为止使用的代码,但不确定如何添加两个键和两个值。 我使用Counter来计数字符串出现的次数,并将其保存到county_names.json,这是我的第二个JSON文件。 ire_countiesTmp.json是我尝试从第二个文件替换值的第一个文件。 我不确定如何使用Python做到这一点,因为它只是开始学习它。 任何帮助都会很棒,或者如果您知道更好的方法。 谢谢

import json, pprint
from collections import Counter

with open('../county_names.json') as data_file:

county_list = json.load(data_file)

for i in county_list:
    c = Counter(i for i in county_list)


for county,count in c.iteritems():

    with open('ire_countiesTmp.json') as f:

            def fixup(adict, k1, v1, k2, v2):
                for key in adict.keys():
                    if adict[key] == v1:
                        adict[key] = v
                    elif type(adict[key]) is dict:
                        fixup(adict[key], k, v)


            #pprint.pprint( data )

            fixup(data, 'id', county, 'density', count)
            pprint.pprint( data )

一般来说,在Python中递归并不是一个好主意。 编译器/解释器不能很好地处理它,并且变得非常慢,因为没有尾部递归优化: 为什么python中的递归这么慢?

假定您已将JSON数据转换为字典的可能的蛮力解决方案可能看起来像这样:

def fixup_dict_a_with_b(a, b):
    for feature_a in a["features"]:
        for feature_b in b["features"]:
            if feature_a["properties"]["id"] == feature_b["name"]:
                feature_a["properties"]["density"] = feature_b["count"]
                break

当然,这可以让您“喜好”。 ;)

还存在其他更优雅的解决方案,但是当您刚开始使用Python时,这一解决方案非常简单易行。 (最终,例如,您可能想研究熊猫。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM