提取CSV棋类数据黑方第二步走法时触发IndexError问题求助
问题排查与解决:处理games.csv时的IndexError问题
问题背景
这段Python代码用于处理棋类对局数据games.csv,核心逻辑是筛选出黑白棋手等级分差在±100范围内,且对应一方获胜的对局:
- 白方获胜时,提取第一步走法
- 黑方获胜时,提取第二步走法
原代码如下:
import csv list = [] with open('games.csv', 'r') as csvfile: reader = csv.DictReader(csvfile) for row in reader: cond = int(row['white_rating']) - int(row['black_rating']) if -100 <= cond <= 100 and row['winner'] == 'white': move = str(row['moves']) move = move.split()[0] list.append(move) elif -100 <= cond <= 100 and row['winner'] == 'black': move = str(row['moves']) move = move.split()[1] ## error is from here list.append(move) print(len(list))
执行时触发错误:
Traceback (most recent call last): File "C:\Users\Said\Desktop\Шахматы\main.py", line 18, in <module> move = move.split()[1] IndexError: list index out of range
错误原因
IndexError的本质是尝试访问不存在的列表索引:当黑方获胜时,部分对局的moves字段拆分后只有1个元素(比如对局只走了1步就结束,例如白方超时判负),此时split()[1]自然会报错;另外还要考虑moves字段为空的极端情况。
解决办法
在提取走法前先判断拆分后的列表长度是否满足要求,不满足则跳过该行,避免报错。修改后的代码如下:
import csv move_list = [] # 避免用list作为变量名,会覆盖Python内置类型 with open('games.csv', 'r', encoding='utf-8') as csvfile: reader = csv.DictReader(csvfile) for row in reader: # 先处理等级分差条件,增加异常处理避免非数字等级分报错 try: white_rating = int(row['white_rating']) black_rating = int(row['black_rating']) except ValueError: continue cond = white_rating - black_rating if not (-100 <= cond <= 100): continue # 处理走法提取,先做长度校验 moves_str = row.get('moves', '') moves_list = moves_str.split() if row['winner'] == 'white': if len(moves_list) >= 1: move_list.append(moves_list[0]) elif row['winner'] == 'black': if len(moves_list) >= 2: move_list.append(moves_list[1]) print(len(move_list))
额外优化点
- 替换了
list变量名,避免覆盖Python内置的list类型 - 增加等级分转整数的异常处理,避免因等级分字段非数字导致报错
- 用
row.get('moves', '')处理moves字段不存在的情况 - 指定编码为
utf-8,适配不同系统下的文件编码问题
内容的提问来源于stack exchange,提问作者Just_a_Goose
相关产品推荐
相关产品推荐

