gpt4 book ai didi

python - 使用 Dictwriter 在 CSV 中动态 header

转载 作者:行者123 更新时间:2023-12-01 02:33:10 24 4
gpt4 key购买 nike

我现有的代码使用 csv.DictWriter 将字典列表写入 CSV。但今天出现了一个新情况,即第三方 API 响应中的字典键有所不同,即某些响应在字典中带有附加键,或者有时响应字典中缺少某些键。

我们想要一个 CSV,其中所有 header 作为字典键并关联 CSV,并且这些 header 的所有相关值都应该是相应的字典值

更新我正在寻找一种不需要将所有结果存储在内存中的解决方案。我正在获取大约 1300 个 API 调用,这些调用在 AWS lambda 上使用 128MB。如果我将它存储在一个列表中(1300次调用*每批25个项目= 32500个字典),肯定会使用超过512MB的Lambda内存。

例如。示例响应数据( response.get('data', []) 的结果):

 [{"a": 1, "b": 2, "d": 3}, {"b": 5, "c": 3, "d":3}, {"a": 22, "b": "25", 8, 9} ... etc]  

在这种情况下,我的 CSV 应该是:

a      b      c      d
1 2 3
5 3 3
22 25 8 9
例如。

# Fetch Third party API data in batches 25 records/batch
def fetch_api_data(self, url, payload):
while True:
response = requests.post(url, json=payload).json()
yield response.get('data', [])
if 'next_page_url' not in response:
break
url = response['next_page_url']


def update_recs_to_csv(self, url, payload):
responses = fetch_api_data(url, payload)
first_25_rows = next(responses)
first_row = first_25_rows[0]
keys = first_row.keys()
with open("output.csv", "w") as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerow(first_row)
for row_dict in responses:
dict_writer.writerow(row_dict) #-- This row_dict comes with different (varying) keys

最佳答案

在一个简化的示例中,假设您的响应是:

response = [{"a": 1, "b": 2, "d": 3}, {"b": 5, "c": 3, "d":3}, {"a": 22, "b": "25"}]

我首先计算响应中存在的键的并集:

common_keys = {k for r in response for k in r}

现在我只需用这些键作为字段名称来编写字典。当键不在特定字典中时,有一个默认值(空):

import csv

with open("out.csv","w",newline="") as f:
cw = csv.DictWriter(f,fieldnames=sorted(common_keys),restval="",delimiter="\t")
cw.writeheader()
cw.writerows(response)

我得到:

a       b       c       d
1 2 3
5 3 3
22 25

编辑:仅当responselist时才有效,因此您必须首先转换为list:

response = list(response)

如果这占用太多内存,那么,由于在不迭代整个列表的情况下无法计算键的并集,唯一的选择是将响应行转储到文件中(例如:1 json dict 每行),同时计算键的并集,然后再次读取该值以创建 csv 文件。

关于python - 使用 Dictwriter 在 CSV 中动态 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46560242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com