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

Python遍历列表的API调用触发IndexError问题求助

问题描述

调用CoinMarketCap API获取加密货币投资组合价格并存入列表时,触发IndexError: list index out of range错误。具体情况:

  • 从Excel文件读取投资组合数据,将"Project"列的代币符号存入project_list后调用API报错
  • 手动填充project_list(如['ETH', 'BTC', 'ADA', 'LINK'])时,代码可正常运行
  • 已确认动态生成的project_list可执行其他操作,排除列表未就绪问题

相关代码如下:

Step 1: 读取Excel文件

crypto_df = pd.read_excel('D:\Trading\CRYPTO\Crypto Portfolio Tracker.xlsx')

Step 2: 生成代币符号列表

project_list = []
for name in crypto_df['Project'].values:
    project_list.append(name)

Step 3: CoinMarketCap API封装类

class CMC:

    def __init__(self, token):
        self.apiurl = 'https://pro-api.coinmarketcap.com'
        self.headers = {'Accepts': 'application/json', 'X-CMC_PRO_API_KEY': token, }
        self.session = Session()
        self.session.headers.update(self.headers)

    def get_all_coins(self):
        url = self.apiurl + '/v1/cryptocurrency/map'
        r = self.session.get(url)
        data = r.json()['data']
        return data

    def get_price(self, symbol):
        url = self.apiurl + '/v2/cryptocurrency/quotes/latest'
        parameters = {'symbol': symbol}
        r = self.session.get(url, params=parameters)
        data = r.json()['data']
        return data

Step 4: 获取价格并存入列表

price_list = []
cmc = CMC(secrets_.API_KEY)
for crypto in project_list:
    price = cmc.get_price(crypto)
    price_list.append(price[crypto][0]['quote']['USD']['price'])
print(price_list)

问题原因分析

报错核心是price[crypto][0]触发索引越界,说明动态生成的project_list中存在异常值,导致API返回的数据结构不符合预期:

  1. Excel列存在空值:"Project"列有空白单元格,读取后存入列表的是空值,调用API时返回的data中无对应键或对应列表为空
  2. 代币符号格式异常:符号包含空格、大小写不一致(如"eth"而非"ETH")、拼写错误,API无法识别,返回结果列表为空
  3. 无效符号导致API响应异常:部分符号不被CoinMarketCap API收录,返回的响应中没有对应代币的价格数据

解决方案

1. 清理数据,生成合规的project_list

# 用原始字符串避免路径转义问题
crypto_df = pd.read_excel(r'D:\Trading\CRYPTO\Crypto Portfolio Tracker.xlsx')

# 过滤空值、清理符号格式(去空格、转大写)、去重
project_list = list(set([
    str(name).strip().upper() 
    for name in crypto_df['Project'].dropna().values
]))

2. 增加异常处理与数据校验,避免程序崩溃

修改价格获取逻辑,对每个代币的API响应做校验,捕获异常:

price_list = []
cmc = CMC(secrets_.API_KEY)

for crypto in project_list:
    try:
        price_data = cmc.get_price(crypto)
        # 校验响应数据是否符合预期
        if crypto in price_data and len(price_data[crypto]) > 0:
            usd_price = price_data[crypto][0]['quote']['USD']['price']
            price_list.append(usd_price)
            print(f"{crypto}: {usd_price:.2f} USD")
        else:
            print(f"警告:未找到 {crypto} 的有效价格数据")
            price_list.append(None)  # 用None标记无效数据,后续可统一处理
    except KeyError:
        print(f"错误:{crypto} 不存在于API响应中")
        price_list.append(None)
    except IndexError:
        print(f"错误:{crypto} 的价格列表为空")
        price_list.append(None)
    except Exception as e:
        print(f"获取 {crypto} 价格时出错:{str(e)}")
        price_list.append(None)

print("\n最终价格列表:", price_list)

3. 调试时查看API响应(可选)

如果仍有问题,打印每个代币的API响应,明确数据结构:

for crypto in project_list:
    price_data = cmc.get_price(crypto)
    print(f"\n{crypto} 的API响应:")
    print(price_data)

内容的提问来源于stack exchange,提问作者nosni khoritz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:25:31