如何用Python实现API返回数据与CSV文件数据映射并输出合并CSV
完整实现代码
import requests import csv # ---------------------- 1. 拉取全量API数据 ---------------------- base_url = "https://api.federalreporter.nih.gov/v1/Projects/search?query=query%3Dorgstate%3ANY%2CDE%2CMD%2CNJ%2CPA%2CCT%2CRI%2CMA%2CVT%2CNH%2CME%24fy%3A2019%24agency%3ANIH&offset=" offset = 1 all_api_projects = [] # 循环拉取所有分页数据 while True: r = requests.get(f"{base_url}{offset}") if r.status_code != 200: print(f"请求失败,状态码:{r.status_code},offset:{offset}") break response_data = r.json() items = response_data.get("items", []) if not items: # 没有数据了,退出循环 break all_api_projects.extend(items) offset += len(items) print(f"共拉取API项目数据:{len(all_api_projects)}条") # 构建匹配用的字典,这里假设用【州代码】作为关联键,可根据实际匹配字段修改 # 如果你需要用PI姓名、机构名等作为匹配键,修改key的取值即可 api_map = {} for project in all_api_projects: match_key = project.get("orgState") # 如果是多对一的关系,用列表存储同一个key下的所有项目 if match_key not in api_map: api_map[match_key] = [] # 只保留需要补充的字段,按需增减 api_map[match_key].append({ "projectNumber": project.get("projectNumber"), "agency": project.get("agency"), "title": project.get("title"), "department": project.get("department"), "fy": project.get("fy"), "totalCostAmount": project.get("totalCostAmount") }) # ---------------------- 2. 读取CSV并匹配数据 ---------------------- input_filename = "legislators.csv" output_filename = "legislators_with_funding.csv" # 先读取原CSV的表头,方便后续加新字段 with open(input_filename, "r", encoding="utf-8") as f: reader = csv.DictReader(f) original_headers = reader.fieldnames # 新增要补充的API字段,按需增减 new_headers = original_headers + ["projectNumber", "agency", "title", "department", "fy", "totalCostAmount"] # 打开输出文件 with open(output_filename, "w", encoding="utf-8", newline="") as out_f: writer = csv.DictWriter(out_f, fieldnames=new_headers) writer.writeheader() # 遍历每一行CSV数据匹配 for row in reader: # 这里取CSV里的州字段作为匹配键,字段名根据你的实际CSV调整 csv_match_key = row.get("state") # 找对应的API数据,这里取第一条匹配的,多匹配逻辑可自行修改 matched_projects = api_map.get(csv_match_key, [{}]) if matched_projects: # 合并数据 row.update(matched_projects[0]) writer.writerow(row) print(f"匹配完成,结果已保存到{output_filename}")
关键修改说明
- 补全了API分页拉取逻辑,避免只拿到第一页的部分数据
- 用
csv.DictReader和csv.DictWriter处理CSV,比直接读行更方便操作字段 - 提前把API数据按关联键构建成索引字典,匹配时时间复杂度是O(1),比双重循环效率高很多
- 关联键可以根据实际需求调整:如果是按获奖者姓名匹配,把API侧的
match_key改成项目的PI姓名字段,CSV侧的csv_match_key改成获奖者姓名字段即可 - 如果需要一对多匹配(一个获奖者对应多个项目),修改匹配逻辑展开输出多行即可
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

