You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:27:00