从嵌套字典的N个列表中选择值

时间:2018-10-15 13:41:38

标签: python json

我正在尝试从REST API中读取响应并将其放入csv文件中。 我已经为响应编写了如下代码:

响应:

data ={
        "status":
        {
            "type":"A",
            "code":"200",
            "severity":"11",
            "message":"",
            "correlationId":""   
        }

        ,

    "Data":{
            "Id":"11",
            "LineNo":"2",
            "requestedAmt":"100",
            "ReceivedDt":"",
            "FromDt":"",
            "ToDate":"",
            "Status":"N"
        }
    }

代码

result =[]    

with open('try.csv','w') as f:
    for rowo in data:
        for rowin in data[rowo]:
            result.append((data[rowo][rowin]))

    f.write(','.join(result)+"\n")

但是如果响应是嵌套的,该怎么办。可能会有多个回应。在这种情况下,我需要从技术上从列表中选择值。但是,如何循环遍历N个列表并从中选择值。

Response :

data ={
        "status":[
        {
            "type":"A",
            "code":"200",
            "severity":"11",
            "message":"",
            "correlationId":""   
        },
        {
            "type":"A",
            "code":"100",
            "severity":"13",
            "message":"",
            "correlationId":""   
        }
    ] #there could be more in same way,

    "Data":[
        {
            "Id":"11",
            "LineNo":"2",
            "requestedAmt":"100",
            "ReceivedDt":"",
            "FromDt":"",
            "ToDate":"",
            "Status":"N"
        },
            "Id":"13",
            "LineNo":"3",
            "requestedAmt":"100",
            "ReceivedDt":"",
            "FromDt":"",
            "ToDate":"",
            "Status":"F"
    ]
} #there could be more in same way

2 个答案:

答案 0 :(得分:0)

您的回复似乎是JSON格式,请尝试

import json
x = json.load('your_response')


data = open('your_response.csv', 'w')
csvwriter = csv.writer(data)

count = 0
for i in x:
  if count == 0:
         header = i.keys()
         csvwriter.writerow(header)
         count += 1
  csvwriter.writerow(i.values())

data.close()

答案 1 :(得分:0)

假设list响应中每个主键之间的json长度是一致的,则可以将list的各个dict展平为一个有凝聚力的{{ 1}}首先:

list

flat_data = [{k:v for j in i for k, v in j.items()} for i in zip(*[data[key] for key in data])] flat_data # [{'FromDt': '', 'Id': '11', 'LineNo': '2', 'ReceivedDt': '', 'Status': 'N', 'ToDate': '', 'code': '200', 'correlationId': '', 'message': '', 'requestedAmt': '100', 'severity': '11', 'type': 'A'}, # 'FromDt': '', 'Id': '13', 'LineNo': '3', 'ReceivedDt': '', 'Status': 'F', 'ToDate': '', 'code': '100', 'correlationId': '', 'message': '', 'requestedAmt': '100', 'severity': '13', 'type': 'A'}] 函数在这种情况下特别有用,因为它实际上允许您在遍历N时创建键的zip(),即每个N将返回一个list的元组此时,您所需要做的就是将元组平整为列表的一个内聚(data['status'], data['Data'], ...)。在这种特殊情况下,我们可以结合使用列表理解和字典理解来实现此目的。

一旦您拥有了扁平化的数据,就可以根据需要将dictlist中的dict写到csv中。您可以考虑使用csv.DictWriter格式的dict

from csv import DictWriter
with open('test.csv', 'w') as f:
    csvwriter = DictWriter(f, flat_data[0].keys(), lineterminator='\n')
    csvwriter.writeheader()
    csvwriter.writerows(flat_data)

结果文件:

type    code    severity    message correlationId   Id  LineNo  requestedAmt    ReceivedDt  FromDt  ToDate  Status
A       200     11                                  11      2   100                                         N
A       100     13                                  13      3   100                                         F

注意:但是,如果一致长度的假设不正确,则此方法将不起作用,因为您需要考虑数据在遇到不一致的行时的外观。此时,将需要其他条件来更新此代码。

相关问题