Python循环中List index out of range错误排查及替代实现问询
问题解决与替代实现方案
1. 「List index out of range」错误排查
这个错误通常来自两个原因:
- 指定读取的行号超出了目标CSV文件的实际行数,比如某份
sheet_x.csv只有10行,但你尝试读取第15行 - 混淆了索引规则:Python列表是0起始索引,如果你习惯了Excel的1起始行号,需要把目标行号减1(比如要读取Excel里的第3行,对应列表索引是2)
排查时可以先打印每个CSV的总行数,确认目标行是否存在:
import csv with open('sheet_1.csv', 'r', newline='') as f: rows = list(csv.reader(f)) print(f"sheet_1.csv 总行数:{len(rows)}")
2. xlwt FutureWarning 处理
xlwt仅支持旧版.xls格式,且已停止维护,官方不再推荐使用。如果你的最终输出是.csv文件,完全不需要使用xlwt;如果需要输出Excel文件,建议改用openpyxl(支持.xlsx格式)作为写入引擎。
3. 替代实现代码(基于pandas,简洁可靠)
使用pandas可以更高效地完成多CSV读取、指定行提取、合并输出的需求,同时避免上述问题:
import pandas as pd import os # 配置参数 target_row = 2 # 要提取的行(0起始,对应Excel第3行) output_cols = ['列1', '列2', '列3'] # 输出CSV的列名,可根据实际调整 csv_files = [f for f in os.listdir('.') if f.startswith('sheet_') and f.endswith('.csv')] # 初始化存储结果的列表 result_data = [] # 循环处理每个CSV文件 for file in csv_files: try: # 读取指定行,仅保留前3列(或根据需求指定列索引) df = pd.read_csv(file, skiprows=lambda x: x != target_row, usecols=[0,1,2]) # 将该行数据转为列表,添加到结果 result_data.append(df.iloc[0].tolist()) print(f"成功读取 {file} 的指定行") except IndexError: print(f"警告:{file} 中不存在指定行,已跳过") except Exception as e: print(f"处理 {file} 时出错:{str(e)}") # 将结果写入输出CSV output_df = pd.DataFrame(result_data, columns=output_cols) output_df.to_csv('sheet_output.csv', index=False, encoding='utf-8-sig') print("已完成数据写入,输出文件:sheet_output.csv")
代码说明:
- 自动识别当前目录下所有
sheet_*.csv文件 - 通过
skiprows精准提取指定行,捕获异常并跳过有问题的文件 - 直接输出CSV,无需依赖xlwt,彻底解决FutureWarning
- 支持自定义输出列名和要提取的列索引(修改
usecols参数即可)
4. 无第三方依赖实现(用内置csv模块)
如果不想用pandas,也可以用Python内置csv模块实现:
import csv import os target_row = 2 # 0起始索引 output_file = 'sheet_output.csv' csv_files = [f for f in os.listdir('.') if f.startswith('sheet_') and f.endswith('.csv')] with open(output_file, 'w', newline='', encoding='utf-8-sig') as out_f: writer = csv.writer(out_f) # 写入表头(可选) writer.writerow(['列1', '列2', '列3']) for file in csv_files: try: with open(file, 'r', newline='', encoding='utf-8-sig') as in_f: reader = csv.reader(in_f) rows = list(reader) # 检查指定行是否存在 if target_row < len(rows): # 取前3列数据 row_data = rows[target_row][:3] writer.writerow(row_data) print(f"成功写入 {file} 的指定行") else: print(f"警告:{file} 总行数不足,已跳过") except Exception as e: print(f"处理 {file} 时出错:{str(e)}")
内容的提问来源于stack exchange,提问作者Grabas
相关产品推荐
相关产品推荐

