如何从 Python 上的 pgn 文件中提取移动信息?我是编程新手,任何帮助将不胜感激。
4 回答
尝试pgnparser。
示例代码:
import pgn
import sys
f = open(sys.argv[1])
pgn_text = f.read()
f.close()
games = pgn.loads(pgn_text)
for game in games:
print game.moves
我没有用于 python 的 PGN 解析器,但您可以从这个地方获取 XCode 的 PGN 解析器的源代码,它可以提供帮助
我不能给你任何 Python 特定的指导,但我最近用 java 写了一个 PGN 转换器,所以我会尝试提供一些建议。Miku 链接的主要缺点是该站点不允许 .pgn 文件中的差异,每个站点似乎在确切格式上略有不同。
一些 .pgn 将移动编号附加到移动本身(1.e4 而不是 1.e4),因此如果您对字符串进行标记,您可以检查点的位置,因为它只出现在移动编号中。
找出你可以拥有的所有不同的移动组合。如果一个动作有 5 个字符长,它可能是 0-0-0(皇后城堡),Nge2+(从 g 到 e2 的骑士,带 check(+)/checkmate(#)),Rexb5(Rook on e 取 b5)。
一个移动的最长字符串可能是 7 个字符(当您必须指定原始等级 AND 文件和一个捕获 AND 并带有检查时)。最短的是 2 个字符(一个典当)。
尽早计划易位和过路移动。您可能已经太晚了,您构建程序的方式并不容易适应它们。
开始时给出的详细信息(ELO 评级、位置等)因文件而异。
@Dennis Golomazov 我喜欢丹尼斯在上面所做的。为了补充他所做的事情,如果您想从 png 文件中的多个游戏中提取移动信息,例如在国际象棋数据库 png 文件中的游戏中,请使用 chess.pgn。
import chess.pgn
png_folder = open('sample.pgn')
current_game = chess.pgn.read_game(png_folder)
png_text = str(current_game.mainline_moves())
read_game() 方法充当迭代器,因此再次调用它将获取 pgn 中的下一个游戏。