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

为何自定义函数仅打印单个比赛ID且无法保存OpenDota API数据?

问题分析与修复方案

一、重复打印同一比赛ID的原因及修复

你的循环中每次调用get_match_by_id(match_id + 1),但match_id的值在循环全程从未更新,始终是初始赋值的6757193237,所以每次传入的参数都是6757193237 + 1 = 6757193238,自然只会打印同一个ID。

修复方案(二选一)

  1. 循环内递增match_id:
match_id = 6757193237
for i in range(0, 5000):
  get_match_by_id(match_id)
  match_id += 1  # 每次循环后让比赛ID自增
  time.sleep(2)
  1. 利用循环变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:05:20