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

提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:20:18