为何自定义函数仅打印单个比赛ID且无法保存OpenDota API数据?
问题分析与修复方案
一、重复打印同一比赛ID的原因及修复
你的循环中每次调用get_match_by_id(match_id + 1),但match_id的值在循环全程从未更新,始终是初始赋值的6757193237,所以每次传入的参数都是6757193237 + 1 = 6757193238,自然只会打印同一个ID。
修复方案(二选一)
- 循环内递增
match_id:
match_id = 6757193237 for i in range(0, 5000): get_match_by_id(match_id) match_id += 1 # 每次循环后让比赛ID自增 time.sleep(2)
- 利用循环变量
i计算递增ID:
start_match_id = 6757193237 for i in range(0, 5000): get_match_by_id(start_match_id + i) time.sleep(2)
(注:你之前先后给match_id赋值两次,若6727193237是预期起始ID,可调整上述代码的起始值)
二、文件未保存的可能原因及修复
1. 目标文件夹不存在
open()函数不会自动创建不存在的目录,如果/content/drive/MyDrive/Win Probability Prediction/downloads这个文件夹未创建,代码会静默抛出异常,导致保存步骤无法执行。
修复:在保存前检查并创建目录,同时改用with语句自动管理文件句柄:
import requests, json, time, os #Download games def get_match_by_id(match_id): m_id = str(match_id) #fetch match data response = requests.get("https://api.opendota.com/api/matches/" + m_id) if response.ok: print("GET:", m_id) data = response.json() # 定义保存目录 save_dir = "/content/drive/MyDrive/Win Probability Prediction/downloads" # 检查目录,不存在则创建 if not os.path.exists(save_dir): os.makedirs(save_dir, exist_ok=True) # 拼接文件路径 file_path = os.path.join(save_dir, f"{m_id}_data.json") # 保存文件 with open(file_path, 'w') as file: json.dump(data, file) else: # 打印请求失败信息,方便排查 print(f"请求失败,ID: {m_id},状态码: {response.status_code}") start_match_id = 6757193237 for i in range(0, 5000): get_match_by_id(start_match_id + i) time.sleep(2)
2. API请求未成功
代码仅在response.ok(状态码200-299)时执行保存逻辑,如果API请求被限制(比如缺少API Key)、比赛ID不存在,会直接跳过保存且无提示。添加else分支打印错误状态码,能快速定位问题。
3. 路径权限不足
如果没有写入该Google Drive路径的权限,也会导致保存失败。可先尝试手动在目标目录创建文件,确认权限正常。
内容的提问来源于stack exchange,提问作者user18377332
相关产品推荐
相关产品推荐

