使用 python-chess 从 PGN 文件中提取移动作为字符串

Extract Moves as Strings from PGN file Using python-chess

我正在使用模块 python-chess (https://python-chess.readthedocs.io/en/latest/index.html) to extract analyze 4 million chess games (http://caissabase.co.uk/).

如何将游戏的所有动作作为 strings 加载到列表中?这个想法是让我能够提取有关移动的信息。例如,女王吃掉了对手的棋子多少次?因此,我会在每个移动字符串中搜索“Qx”。我试过这个:

test = [] # list I wish to append moves to (as strings)
game = chess.pgn.read_game(pgn)

board = game.board()

for move in game.mainline_moves():
    board.push(move)
    test.append(board.san(move)) # this does not work and seems to cause the below error

以上代码产生以下错误:

AssertionError: san() and lan() expect move to be legal or null, but got g1f3 in rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - 1 1

然而,没有 test.append(board.san(move)) 的其余代码将所有游戏动作打印为字符串就好了。

非常感谢任何帮助。

board.san(move) 为您提供基于当前位置的移动符号(参见 documentation)。但是,您之前已经通过在棋盘上移动改变了头寸。因此它不承认第一个马移动 g1f3 是合法的:马已经在 f3!

我怀疑如果你交换循环中的两条线,它应该可以工作。也就是说,您首先需要写下这一步棋,然后再下棋(与实际下国际象棋有些不同;))