【问题标题】:Extracting move information from a pgn file on Python从 Python 上的 pgn 文件中提取移动信息
【发布时间】:2021-02-12 00:05:57
【问题描述】:

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

【问题讨论】:

  • 到目前为止,我可以以这种形式返回一串动作:'1.e4 c6 2.d3 d5 3.Nd2 e5 4.Ngf3 Nd7 5.d4 dxe4 6.Nxe4 exd4 7.Qxd4 Ngf6 8.Bg5 Be7...etc 我现在需要做的是返回一个字符串,它以这种形式总结了 movetext 中的信息:“White move the pawn at e2 to e4.\nBlack move the pawn at e7 to e5 。”
  • 另外,对于某些文件,字符串以这种形式返回:'1. e4 e5 2. f4 exf4 3. Nf3 g5 4. h4 g4 5. Ne5 Nf6 6. d4 d6 7. Nd3 Nxe4...etc 移动号后面有一个空格。

标签: python chess


【解决方案1】:

试试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

【讨论】:

  • 这个答案应该是公认的答案。已经六年了,但这个答案对我有所帮助,因为我面临着完全相同的困境,即不知道使用哪个解析器来浏览我的 png 文件,尤其是官方文档的稀疏程度。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    我没有 Python 的 PGN 解析器,但您可以从 this place 获取 XCode 的 PGN 解析器的源代码,它可以提供帮助

    【讨论】:

      【解决方案4】:

      @丹尼斯·戈洛马佐夫 我喜欢丹尼斯上面所做的。为了补充他所做的事情,如果您想从 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 中的下一个游戏。

      【讨论】:

      • 我觉得应该是current_game.mainline_moves()
      • 很好的发现。刚刚改了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多