CSV文件处理时访问列表元素触发IndexError问题排查
解决CSV读取时的IndexError及行号匹配问题
看起来你的代码遇到了几个关键问题:空行导致的索引错误、大小写不匹配的逻辑问题,还有没完成的后续行匹配逻辑。让我一步步帮你搞定:
错误原因拆解
- IndexError: list index out of range:这个报错说明你的CSV文件里存在空行(或者某些行没有被逗号分割出任何元素),当
csv.reader读取到空行时会返回一个空列表[],这时候访问row[0]自然会触发索引越界。 - 大小写不匹配:你的CSV第一行是
Line number(小写n),但代码里判断的是"Line Number"(大写N),这会导致无法匹配到目标行,循环会继续执行直到遇到空行触发错误。 - CSV格式可能异常:你给出的CSV内容看起来像是丢失了换行符,正确的CSV应该每行是一条独立记录,否则
csv.reader无法正确分割数据。
修正后的完整代码
这里是调整后的代码,包含空行处理、大小写匹配、安全的数字转换以及完整的行匹配逻辑:
import csv target_line_number = 0 found_match = False with open('B.txt', 'r') as f: reader = csv.reader(f, delimiter=",") for row in reader: # 跳过空行,避免索引错误 if not row: continue # 匹配第一行的Line number(注意和CSV内容大小写一致) if "Line number" in row[0]: # 先确保行有足够元素再提取数字 if len(row) >= 2: try: # 去除可能的空格后转换为整数 target_line_number = int(row[1].strip()) print(f"获取到目标行号: {target_line_number}") except ValueError: print("Line number后的内容不是有效数字,请检查CSV格式") break else: print("Line number行格式错误,没有后续数字") break continue # 跳过当前行,继续遍历后续行找匹配 # 检查当前行第一个元素是否等于目标行号 if row[0].strip() == str(target_line_number): print(f"找到匹配行: {row}") found_match = True break # 处理未找到匹配的情况 if not found_match and target_line_number != 0: print(f"未找到与行号{target_line_number}匹配的行")
关键改进点
- 空行防护:增加
if not row: continue,直接跳过空行,避免访问空列表的索引。 - 大小写统一:把判断条件改成
"Line number",和CSV里的内容完全匹配。 - 安全的数字转换:增加
len(row) >=2的检查,以及try-except捕获数字转换失败的情况,避免格式错误导致程序崩溃。 - 完整匹配逻辑:在获取目标行号后,继续遍历后续行,检查每行第一个元素是否匹配目标值。
- 去除冗余空格:用
strip()处理元素前后的空格,避免CSV里的空格导致匹配失败(比如row[1]可能带有空格)。
确保CSV文件格式正确
你的CSV文件必须是每行一条独立记录,正确格式如下:
Line number,1
1,K1,O1,L1,L2,L3
2,K2,O2,L2,L3
3,K3,O3,L1,L3
4,K4,O4,L2
如果你的文件里是把这些内容连在一起的(没有换行),那csv.reader会把整个内容当成一行,分割后的元素会完全混乱,这时候需要先修正文件的换行格式。
内容的提问来源于stack exchange,提问作者requiry
相关产品推荐
相关产品推荐

