Python 使用格式从CSV创建JSON

Python 使用格式从CSV创建JSON,python,json,Python,Json,我希望构建以下结构。我已经编写了解析csv的代码。但现在,我希望格式化csv的结构。我想在每个元素的区域id或主节点内对testInfo和finInfo进行分组 Json示例: [ { "area_id": "13", "area_name": "Joanne Smith", "test_diff": "27%", "test_id": "1239", "test_pull": "119",

我希望构建以下结构。我已经编写了解析csv的代码。但现在,我希望格式化csv的结构。我想在每个元素的区域id或主节点内对testInfo和finInfo进行分组

Json示例:

    [
    {
        "area_id": "13", 
        "area_name": "Joanne Smith", 
        "test_diff": "27%", 
        "test_id": "1239", 
        "test_pull": "119", 
        "test_name": "Finals 2019",
        "fin_id" : "019",
        "fin_name" : "Results Fin 2019"
    }, 
    {
        "area_id": "12", 
        "area_name": "Joe Turner", 
        "test_diff": "7%", 
        "test_id": "1233", 
        "test_pull": "149", 
        "test_name": "Finals 2020",
        "fin_id" : "000",
        "fin_name" : "Results Fin 2020"
    }, 
    {
        "area_id": "12", 
        "area_name": "Joe Turner", 
        "test_diff": "7%", 
        "test_id": "1234", 
        "test_pull": "150", 
        "test_name": "Finals 2020",
        "fin_id" : "001",
        "fin_name" : "Results Fin 2020"
    }, 
    {
        "area_id": "12", 
        "area_name": "Joe Turner", 
        "test_diff": "7%", 
        "test_id": "1234", 
        "test_pull": "150", 
        "test_name": "Finals 2020",
        "fin_id" : "003",
        "fin_name" : "Results Fin 2020"
    }
]
我要寻找的最终结果是

[{"areaid":"12","areaname":"Joe Turner","testInfo":[{"testid":"1233","testname":"Finals 2020"},{"testid":"1234","testname":"Finals 2020"},{"testid":"1234","testname":"Finals 2020"}],"finInfo":[{"finid":"000","finname":"Results Fin 2020"},{"finid":"001","finname":"Results Fin 2020"},{"finid":"003","finname":"Results Fin 2020"}]},{"areaid":"13","areaname":"Joanne Smith","testInfo":[{"testid":"1239","testname":"Finals 2019"}],"finInfo":[{"finid":"019","finname":"Results Fin 2019"}]}]
期望输出

[ { "areaid":"12", "areaname":"Joe Turner", "testInfo":[ { "testid":"1233", "testname":"Finals 2020", "finInfo":[ { "finid":"000", "finname":"Results Fin 2020" } ] }, { "testid":"1234", "testname":"Finals 2020", "finInfo":[ { "finid":"001", "finname":"Results Fin 2020" }, { "finid":"003", "finname":"Results Fin 2020" } ] } ] }, { "areaid":"13", "areaname":"Joanne Smith", "testInfo":[ { "testid":"1239", "testname":"Finals 2019", "finInfo":[ { "finid":"019", "finname":"Results Fin 2019" } ] } ] } ]

不确定输出格式应该是什么,但您可以尝试使用此代码示例并用实现替换
print
调用

从集合导入defaultdict

arr = [
    {
        "area_id": "13",
        "area_name": "Joanne Smith",
        "test_diff": "27%",
        "test_id": "1239",
        "test_pull": "119",
        "test_name": "Finals 2019",
        "fin_id" : "019",
        "fin_name" : "Results Fin 2019"
    },
    {
        "area_id": "12",
        "area_name": "Joe Turner",
        "test_diff": "7%",
        "test_id": "1233",
        "test_pull": "149",
        "test_name": "Finals 2020",
        "fin_id" : "000",
        "fin_name" : "Results Fin 2020"
    },
    {
        "area_id": "12",
        "area_name": "Joe Turner",
        "test_diff": "7%",
        "test_id": "1234",
        "test_pull": "150",
        "test_name": "Finals 2020",
        "fin_id" : "001",
        "fin_name" : "Results Fin 2020"
    },
    {
        "area_id": "12",
        "area_name": "Joe Turner",
        "test_diff": "7%",
        "test_id": "1234",
        "test_pull": "150",
        "test_name": "Finals 2020",
        "fin_id" : "003",
        "fin_name" : "Results Fin 2020"
    }
]

formatted_data = defaultdict(lambda: {
    'testinfo': [],
    'fininfo': []
})

for item in arr:
    area_id = item['area_id']
    area_name = item['area_name']
    area_data = formatted_data[(area_id, area_name)]
    area_data['testinfo'].append({
        'testid': item['test_id'],
        'testname': item['test_name']
    })
    area_data['fininfo'].append({
        'finid': item['fin_id'],
        'finname': item['fin_name']
    })

result = []
for (area_id, area_name), item_data in formatted_data.items():
    result_item = {}
    result_item['areaid'] = area_id
    result_item['areaname'] = area_name
    result_item['testInfo'] = []
    for testinfo in item_data['testinfo']:
        result_item['testInfo'].append(testinfo)
    result_item['finInfo'] = []
    for fininfo in item_data['fininfo']:
        result_item['finInfo'].append(fininfo)

    result.append(result_item)

print(result)
期望输出

[ { "areaid":"12", "areaname":"Joe Turner", "testInfo":[ { "testid":"1233", "testname":"Finals 2020", "finInfo":[ { "finid":"000", "finname":"Results Fin 2020" } ] }, { "testid":"1234", "testname":"Finals 2020", "finInfo":[ { "finid":"001", "finname":"Results Fin 2020" }, { "finid":"003", "finname":"Results Fin 2020" } ] } ] }, { "areaid":"13", "areaname":"Joanne Smith", "testInfo":[ { "testid":"1239", "testname":"Finals 2019", "finInfo":[ { "finid":"019", "finname":"Results Fin 2019" } ] } ] } ]
[ { “区域ID”:“12”, “区域名称”:“乔·特纳”, “testInfo”:[ { “testid”:“1233”, “测试名称”:“2020年总决赛”, “finInfo”:[ { “finid”:“000”, “finname”:“2020年财务结果” } ] }, { “testid”:“1234”, “测试名称”:“2020年总决赛”, “finInfo”:[ { “finid”:“001”, “finname”:“2020年财务结果” }, { “finid”:“003”, “finname”:“2020年财务结果” } ] } ] }, { “区域ID”:“13”, “区域名称”:“Joanne Smith”, “testInfo”:[ { “testid”:“1239”, “测试名称”:“2019年决赛”, “finInfo”:[ { “finid”:“019”, “finname”:“2019年财务结果” } ] } ] }
]

到此为止,我根据您提交的解决方案,用所需的输出更新了帖子。请让我知道这是否可以实现。所以最后一个问题。看看结果,我想我可能把结果搞混了。finInfo应该是testInfo的子集。这样,如果有多个testid,它们将只显示一个,并且testid下可以有多个finid或信息。让我知道这是否有意义。@kingjtiv您能提供一个所需输出的示例吗?添加到您的解决方案中。同时更新到main。非常感谢。