Tensorflow1.5+Python3.6下IndexError: list index out of range问题求助
问题解决:IndexError: list index out of range(加载specs.csv时)
错误原因
报错行Accuracy_accountant = Lines[-1]触发索引越界,说明读取specs.csv后得到的Lines列表是空的——要么文件本身为空,要么文件内容无法被解析为有效行,或者读取方式导致解析失败。
代码问题分析
原代码存在两个潜在问题:
- 假设
specs.csv存在就一定包含至少2行可转换为float的有效数据,未处理文件内容不足或无效的情况 - Python 3中使用
rb(二进制模式)打开文本文件,可能导致csv.reader解析异常,无法正确读取行数据
解决方案
检查specs.csv文件状态
- 确认目标路径下的
specs.csv非空,且至少包含2行可转换为浮点数的有效内容 - 若为首次运行,检查代码中初始化写入
specs.csv的逻辑,确认数据已正确写入文件
- 确认目标路径下的
修正文件打开模式
将文件打开代码从:with open(directory + '/specs.csv', 'rb') as csvfile:修改为:
with open(directory + '/specs.csv', 'r', newline='') as csvfile:Python 3的csv模块推荐使用文本模式读取,避免二进制模式下的换行符解析问题
添加容错处理逻辑
在访问列表索引前先校验长度,避免空列表或长度不足导致的报错,示例如下:if os.path.isfile(directory + '/specs.csv'): with open(directory + '/specs.csv', 'r', newline='') as csvfile: reader = csv.reader(csvfile) Lines = [] for line in reader: # 跳过空行,避免转换失败 if line: try: Lines.append([float(j) for j in line]) except ValueError: # 跳过无法转换为float的行 continue # 校验列表长度后再访问索引 if len(Lines) >= 2: Accuracy_accountant = Lines[-1] Delta_accountant = Lines[1] else: # 执行初始化逻辑,设置默认值并写入文件 Accuracy_accountant = [0.0] # 根据业务场景调整默认值 Delta_accountant = [1e-5] # 将默认值写入specs.csv,避免后续重复报错 with open(directory + '/specs.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(Delta_accountant) writer.writerow(Accuracy_accountant) else: # 原有的初始化逻辑 ...
内容的提问来源于stack exchange,提问作者Yi Eric
相关产品推荐
相关产品推荐

