如何将飞镖API的嵌套JSON数据转换并存储为CSV文件
解决方案:将嵌套飞镖API JSON转换为CSV格式
我懂你现在的困境——能遍历JSON结构但不知道怎么精准抓需要的字段存成CSV对吧?咱们直接上可行的方案,一步步来搞定它。
首先,先明确咱们要提取的字段(结合你给的JSON结构做了点小调整,因为有些字段名和你描述的不太一致,我会在代码里标注):
- season的
start_date(你提到的start_time在JSON里season对象没有,我猜你要么是笔误,要么是想拿sport_event本身的start_time,代码里可以轻松改) - 两位参赛者的名字(区分主客场)
- sport_event_status里的状态字段(你说的
id和name在给定的JSON里不存在,我提取了status和match_status,如果实际数据有对应字段可以替换) - winner_id
接下来是完整的Python代码,直接就能用:
import json import csv # 加载你的JSON文件,替换成你的文件路径 with open('path_of_file.json', 'r', encoding='utf-8') as f: data = json.load(f) # 定义CSV表头,根据需求可以自行修改 csv_headers = [ "赛季开始日期", "主场参赛者", "客场参赛者", "赛事状态", "比赛状态", "获胜者ID" ] # 用来存提取后的数据 extracted_rows = [] # 遍历每个赛事摘要 for summary in data['summaries']: sport_event = summary['sport_event'] event_status = summary['sport_event_status'] # 提取赛季的开始日期(如果要sport_event的start_time,改成sport_event['start_time']即可) season_start = sport_event['sport_event_context']['season']['start_date'] # 从参赛者列表里区分主客场名字 competitors = sport_event['competitors'] home_name = next(comp['name'] for comp in competitors if comp['qualifier'] == 'home') away_name = next(comp['name'] for comp in competitors if comp['qualifier'] == 'away') # 提取赛事状态相关字段 event_status_val = event_status['status'] match_status_val = event_status['match_status'] # 提取获胜者ID winner_id = event_status['winner_id'] # 把当前赛事的所有字段整理成一行 extracted_rows.append([ season_start, home_name, away_name, event_status_val, match_status_val, winner_id ]) # 写入CSV文件 with open('飞镖赛事数据.csv', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file) writer.writerow(csv_headers) # 写表头 writer.writerows(extracted_rows) # 写所有数据行 print("CSV文件生成完成!")
代码说明:
- 安全加载文件:用
with open代替直接打开文件,避免忘记关闭文件的问题 - 精准提取嵌套字段:逐层访问JSON的嵌套结构,比如
sport_event['sport_event_context']['season']['start_date']就是直接拿到赛季的开始日期 - 区分主客场参赛者:用
next()函数从参赛者列表里筛选出主客场的名字,比循环遍历更简洁 - CSV写入:用Python内置的
csv模块,确保生成的CSV格式规范,支持中文编码
小调整建议:
- 如果确实需要sport_event的
start_time,把season_start = sport_event['sport_event_context']['season']['start_date']改成season_start = sport_event['start_time']就行 - 如果你的JSON里sport_event_status真的有
id和name字段,直接替换代码里对应的键名即可 - 如果有特殊的参赛者情况(比如多于两个),可以调整筛选参赛者的逻辑
内容的提问来源于stack exchange,提问作者ostmau
相关产品推荐
相关产品推荐

