如何从ESPN API生成的字典数据创建规范的.csv文件?
将NFL赛事字典数据转为CSV(Pandas实现及优化方案)
先修正原代码的小问题
你的代码里event_short_name = ["shortName"]是笔误,应该改为event_short_name = game["shortName"],否则这个字段会存成固定列表["shortName"],无法获取到赛事的简称。
方法一:用Pandas转换现有嵌套字典
你的data是多层嵌套结构(Week -> Game -> 字段),而机器学习需要扁平的表格数据(每行对应一场比赛),所以第一步要把嵌套字典展开:
import pandas as pd # 展开嵌套字典为扁平列表 flat_data = [] for week_name, games in data.items(): # 提取周数,比如"Week 1"转为1 week_num = int(week_name.split()[1]) for game_name, game_info in games.items(): # 给单场比赛数据加上周数字段 game_row = { "Week": week_num, **game_info # 展开原有的赛事字段 } flat_data.append(game_row) # 转为DataFrame df = pd.DataFrame(flat_data) # 导出为CSV df.to_csv("nfl_2022_games.csv", index=False)
这样导出的CSV每行对应一场比赛,包含Week、Event Name、Short Name、Date、Winner字段,完全符合机器学习的输入要求。
方法二:更简便的爬取+转换流程
你现在的流程是先构建嵌套字典再展开,其实可以在爬取阶段直接构建扁平数据,省去后续展开的步骤,效率更高:
修改爬取代码,直接收集单场比赛的信息到列表:
import requests import pandas as pd root_link = "http://sports.core.api.espn.com/v2/sports/football/leagues/nfl/seasons/2022/types/2/weeks?lang=en®ion=us" response1 = requests.get(url=root_link) weeks = response1.json() # 初始化扁平数据列表 flat_data = [] for i in range(16): print(f"========= WEEK {i + 1}/16 =========") week_link = weeks["items"][i]["$ref"] response2 = requests.get(url=week_link) week_data = response2.json() get_events = week_data["events"]["$ref"] response3 = requests.get(url=get_events) week_games = response3.json() for j in range(len(week_games["items"])): game_link = week_games["items"][j]["$ref"] response4 = requests.get(url=game_link) game = response4.json() event_name = game["name"] event_date = game["date"] # 修正笔误 event_short_name = game["shortName"] # 判断获胜队伍 competitors = game["competitions"][0]["competitors"] winner_competitor = competitors[0] if competitors[0]["winner"] else competitors[1] winner_link = winner_competitor["team"]["$ref"] response5 = requests.get(url=winner_link) winner_data = response5.json() winner = winner_data["displayName"] # 直接添加到扁平列表,带上周数 flat_data.append({ "Week": i + 1, "Event Name": event_name, "Short Name": event_short_name, "Date": event_date, "Winner": winner }) print(f"FINISHED FOR GAME {j + 1}/{len(week_games['items'])}") # 直接转DataFrame并导出 df = pd.DataFrame(flat_data) df.to_csv("nfl_2022_games.csv", index=False)
这种方式不需要先构建多层嵌套字典,爬取的同时就生成了符合CSV格式要求的结构化数据,代码更简洁,内存占用也更低。
内容的提问来源于stack exchange,提问作者Raylo
相关产品推荐
相关产品推荐

