我正在尝试从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
答案 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'], ...)
。在这种特殊情况下,我们可以结合使用列表理解和字典理解来实现此目的。
一旦您拥有了扁平化的数据,就可以根据需要将dict
个list
中的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
注意:但是,如果一致长度的假设不正确,则此方法将不起作用,因为您需要考虑数据在遇到不一致的行时的外观。此时,将需要其他条件来更新此代码。