将CSV转换为字典列表时触发IndexError:列表索引超出范围
解决列表索引超出范围错误及代码修正
一、索引越界错误的原因及解决
你遇到的IndexError: list index out of range主要来自两个可能:
- CSV文件存在空白行:如果文件末尾有空白行,
csv_reader会读取到一个空列表row,此时循环遍历表头索引时,row[i]会因行内容为空触发索引越界。 - 某行数据列数与表头不匹配:若某行的逗号分隔字段数量少于表头的6个字段,也会导致该错误。
修复方法:
读取每行前先校验行长度与表头是否一致,不一致则跳过该行:
for row in csv_reader: # 跳过空行或列数不匹配的无效行 if len(row) != len(headers): continue for i, title in enumerate(headers): data[title].append(row[i])
二、代码中其他逻辑错误修正
除了索引问题,你的代码还有几处错误会导致后续运行失败:
类型转换逻辑错误:
你写的for i in range(len(["OPEN"]))完全错误——["OPEN"]是仅含一个字符串的列表,len结果为1,只会处理第一个元素;且["OPEN"][i]取的是字符串"OPEN",不是数据里的数值。正确写法用列表推导式更简洁:# 转换OPEN列数值类型 data["OPEN"] = [float(val) for val in data["OPEN"]] # 转换CLOSE列数值类型 data["CLOSE"] = [float(val) for val in data["CLOSE"]]绘图参数错误:
ax.plot(["DATE"], ["OPEN"])里的["DATE"]是字符串列表,不是你处理后的日期数据,需传入字典中存储的实际数据:ax.plot(data["DATE"], data["OPEN"], label="OPEN") ax.plot(data["DATE"], data["CLOSE"], label="CLOSE") # 添加图例提升可读性 ax.legend()图表显示兼容问题:
fig.show()在部分环境下无法正常显示,建议替换为plt.show()。
三、修正后的完整代码
import csv import datetime import matplotlib.pyplot as plt filename = "pathtocsv.csv" with open(filename, "r") as file: csv_reader = csv.reader(file) headers = next(csv_reader) # 用字典推导式初始化数据结构更简洁 data = {title: [] for title in headers} for row in csv_reader: if len(row) != len(headers): continue for i, title in enumerate(headers): data[title].append(row[i]) # 批量转换日期格式 data["DATE"] = [datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M') for date_str in data["DATE"]] # 批量转换数值类型 data["OPEN"] = [float(val) for val in data["OPEN"]] data["CLOSE"] = [float(val) for val in data["CLOSE"]] fig, ax = plt.subplots() ax.plot(data["DATE"], data["OPEN"], label="OPEN") ax.plot(data["DATE"], data["CLOSE"], label="CLOSE") ax.legend() fig.autofmt_xdate() plt.show()
内容的提问来源于stack exchange,提问作者Clement44
相关产品推荐
相关产品推荐

