Xml в шахматном формате PGN с использованием PythonPython

Программы на Python
Ответить
Anonymous
 Xml в шахматном формате PGN с использованием Python

Сообщение Anonymous »

Код: Выделить всё

import xml.etree.ElementTree as ET
import chess
import chess.pgn

xml_data = """







































"""

def collect_main_line(xml_elem):
"""Собирает ходы только из высшего уровня   — без вложенных ."""
moves = []
for child in xml_elem:
if child.tag.lower() == "move":
m = child.get("m")
if m:
moves.append(m)
return moves

def xml_to_mainline_pgn(root_line):
# Создаём игру
game = chess.pgn.Game()

# Устанавливаем начальную позицию, если указан FEN
fen = root_line.get("fen")
if fen:
board = chess.Board(fen)
game.setup(board)
else:
board = chess.Board()
game.setup(board)

moves_san = collect_main_line(root_line)

node = game

for san in moves_san:
move = board.parse_san(san)
board.push(move)
node = node.add_main_variation(move)

return game

def main():
root = ET.fromstring(xml_data.strip())
game = xml_to_mainline_pgn(root)

exporter = chess.pgn.StringExporter(headers=True, variations=False, comments=False)
pgn_text = game.accept(exporter)

print(pgn_text)

with open("main_line_only.pgn", "w", encoding="utf-8") as f:
f.write(pgn_text)

print("PGN сохранён в main_line_only.pgn")

if __name__ == "__main__":
main()
У меня есть XML-подобная структура, описывающая шахматную линию с вложенными тегами и .
Я пытаюсь преобразовать эту структуру в файл PGN с помощью библиотеки python-chess.
Я уже знаю, как добавить ходы по основной линии в Chess.pgn.Game(), но не могу понять, как правильно добавить варианты и вложенные подварианты в дерево PGN.
Как рекурсивно добавлять ходы и варианты в python-chess, чтобы каждый вложенный стал правильным вариантом PGN (т. е. (...))?
Должен ли я вручную пройти по дереву и использовать node.add_variation(move) для каждой ветки? Или есть более идиоматический способ создания PGN с подвариантами, используя python-chess?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ing-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»