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返回的数据结构不符合预期:
- Excel列存在空值:"Project"列有空白单元格,读取后存入列表的是空值,调用API时返回的
data中无对应键或对应列表为空 - 代币符号格式异常:符号包含空格、大小写不一致(如"eth"而非"ETH")、拼写错误,API无法识别,返回结果列表为空
- 无效符号导致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
相关产品推荐
相关产品推荐

