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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:06:24