9

如何从 Python 上的 pgn 文件中提取移动信息?我是编程新手,任何帮助将不胜感激。

4

4 回答 4

9

尝试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
于 2013-11-14T03:05:34.373 回答
4

我没有用于 python 的 PGN 解析器,但您可以从这个地方获取 XCode 的 PGN 解析器的源代码,它可以提供帮助

于 2012-05-09T12:58:25.973 回答
4

我不能给你任何 Python 特定的指导,但我最近用 java 写了一个 PGN 转换器,所以我会尝试提供一些建议。Miku 链接的主要缺点是该站点不允许 .pgn 文件中的差异,每个站点似乎在确切格式上略有不同。

  1. 一些 .pgn 将移动编号附加到移动本身(1.e4 而不是 1.e4),因此如果您对字符串进行标记,您可以检查点的位置,因为它只出现在移动编号中。

  2. 找出你可以拥有的所有不同的移动组合。如果一个动作有 5 个字符长,它可能是 0-0-0(皇后城堡),Nge2+(从 g 到 e2 的骑士,带 check(+)/checkmate(#)),Rexb5(Rook on e 取 b5)。

  3. 一个移动的最长字符串可能是 7 个字符(当您必须指定原始等级 AND 文件和一个捕获 AND 并带有检查时)。最短的是 2 个字符(一个典当)。

  4. 尽早计划易位和过路移动。您可能已经太晚了,您构建程序的方式并不容易适应它们。

  5. 开始时给出的详细信息(ELO 评级、位置等)因文件而异。

于 2012-04-27T14:25:56.237 回答
4

@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 中的下一个游戏。

于 2020-06-06T02:09:56.347 回答