Extraiga datos de archivos PGN usando la biblioteca de ajedrez en Python

En este artículo, vamos a ver cómo extraer datos de archivos PGN usando la biblioteca de ajedrez en Python.

Con la ayuda de la biblioteca de ajedrez en python, podemos realizar varias operaciones, como validar un movimiento, extraer datos e incluso realizar movimientos en el tablero de ajedrez. En este artículo, extraeremos datos de un archivo PGN o una string PGN utilizando la biblioteca python-chess.

Instalación de la biblioteca: Ingrese el siguiente comando en el símbolo del sistema.

pip install chess

¿Qué son los archivos PGN?

PGN significa Notación de juego portátil. Es el formato estándar utilizado para registrar los movimientos realizados por los jugadores en un juego de ajedrez. Al usar el formato PGN, podemos grabar y almacenar los movimientos del juego en un archivo de texto normal. 

Cada vez que jugamos al ajedrez en línea en sitios web populares como https://chess.com o https://lichess.org, estos sitios web generan automáticamente los archivos PGN de ​​nuestros juegos. Podemos usar estos archivos para ver y analizar nuestros juegos en el futuro. Usaremos estos archivos PGN para extraer datos de nuestros juegos de ajedrez usando la biblioteca de ajedrez en Python.

Echemos un vistazo al contenido de un archivo PGN para comprender el contenido del archivo.

[Event "Live Chess"]
[Site "Chess.com"]  
[Date "2021.08.05"] 
[Round "-"]
[White "urvishmhjn"]
[Black "yannickhs"]
[Result "1-0"]
[CurrentPosition "r1b1q1r1/p2nbk2/4pp1Q/1p1p3B/2pP3N/1PP1P3/P4PPP/R4RK1 b - -"]
[Timezone "UTC"]
[ECO "A45"]
[UTCDate "2021.08.05"]
[UTCTime "09:25:32"]
[WhiteElo "1220"]
[BlackElo "1140"]
[TimeControl "900+10"]
[Termination "urvishmhjn won by resignation"]

1. d4 Nf6 2. Bf4 e6 3. e3 d5 4. Bd3 c5 5. c3 c4 6. Be2 Nc6 
7. Nf3 Be7 8. Nbd2 O-O 9. O-O Nh5 10. Be5 Nxe5 11. Nxe5 Nf6 
12. b3 b5 13. Qc2 Nd7 14. Ndf3 f6 15. Ng4 h5 16. Nh6+ gxh6 
17. Qg6+ Kh8 18. Qxh6+ Kg8 19. Qxh5 Qe8 20. Qg4+ Kf7 
21. Nh4 Rg8 22. Qh5+ Kf8 23. Qh6+ Kf7 24. Bh5+ 1-0 

En el archivo anterior, podemos ver que parte del texto está escrito entre corchetes. Estos corchetes se denominan pares de etiquetas. El contenido dentro de un par de etiquetas nos brinda información básica sobre el juego y los jugadores que lo juegan. Por ejemplo, los pares de etiquetas nos dicen el nombre de usuario de cada jugador, la fecha en la que se jugó el juego, el formato de tiempo del juego, qué jugador ganó el juego, etc. 

También podemos ver el texto sin corchetes. Este texto representa las jugadas realizadas por cada jugador. Los números 1., 2., 3. , etc. denotan los números de movimiento. El texto d4, Cf6, Bh+ , etc. es la forma estándar de indicar el movimiento de una pieza en el tablero de ajedrez. El texto 1-0  escrito al final del archivo indica que las blancas han ganado el juego. 0-1 significa que las negras han ganado y 1/2-1/2 significa que el juego fue un empate. 

Implementación

Ahora que entendemos qué son los archivos PGN, importaremos la biblioteca de ajedrez y llamaremos a la función Board() para crear un tablero de ajedrez virtual.

También necesitaremos importar chess.pgn para realizar operaciones en el archivo/string pgn.

Python3

import chess
import chess.pgn
  
# creating a virtual chessboard
board = chess.Board()
  
print(board)

Salida :

r n b q k b n r
p p p p p p p p
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
P P P P P P P P
R N B Q K B N R

Si tiene un archivo .pgn del que desea extraer datos, use el siguiente código. Si juega al ajedrez en los sitios web mencionados anteriormente, puede descargar los archivos PGN de ​​sus juegos desde esos sitios web.

pgn = open(“your-pgn-file.pgn”) # abriendo el archivo en python

game = chess.pgn.read_game(pgn) # leyendo el juego presente en el archivo

Si tiene una string que contiene los datos del archivo pgn, deberá convertir la string en un objeto StringIO porque la biblioteca de ajedrez solo admite los objetos StringIO . Puedes usar el siguiente código.

Python3

# We need to convert the PGN string into a StringIO object
# to use a string in python-chess
from io import StringIO
  
# Paste your PGN string here
pgn_string = """[Event "Live Chess"]
[Site "Chess.com"]  
[Date "2021.08.05"] 
[Round "-"]
[White "urvishmhjn"]
[Black "yannickhs"]
[Result "1-0"]
[CurrentPosition "r1b1q1r1/p2nbk2/4pp1Q/1p1p3B/2pP3N/1PP1P3/P4PPP/R4RK1 b - -"]
[Timezone "UTC"]
[ECO "A45"]
[UTCDate "2021.08.05"]
[UTCTime "09:25:32"]
[WhiteElo "1220"]
[BlackElo "1140"]
[TimeControl "900+10"]
[Termination "urvishmhjn won by resignation"]
  
1. d4 Nf6 2. Bf4 e6 3. e3 d5 4. Bd3 c5 5. c3 c4 6. Be2 Nc6 
7. Nf3 Be7 8. Nbd2 O-O 9. O-O Nh5 10. Be5 Nxe5 11. Nxe5 Nf6 
12. b3 b5 13. Qc2 Nd7 14. Ndf3 f6 15. Ng4 h5 16. Nh6+ gxh6 
17. Qg6+ Kh8 18. Qxh6+ Kg8 19. Qxh5 Qe8 20. Qg4+ Kf7 
21. Nh4 Rg8 22. Qh5+ Kf8 23. Qh6+ Kf7 24. Bh5+ 1-0 
"""
  
# Converting the string into StringIO object
pgn = StringIO(pgn_string)
  
# Reading the game
game = chess.pgn.read_game(pgn)

Hemos definido una variable llamada juego. Contiene información sobre todo el juego.

Veamos ahora algunos de los detalles del juego.

Python3

# username of the player playing with white
white_username = game.headers['White']
  
# username of the player playing with black
black_username = game.headers['Black']
time_control = game.headers['TimeControl'] 
  
# time format of the game
# who won the game
game_result = game.headers['Result']  
  
# Make sure that each header name
# used above is present in the PGN
print("White's chess.com Username:", white_username)
print("Black's chess.com Username:", black_username)
print("Game's Time Control:", time_control, "seconds")
print("Game Result:", game_result)
  
# If white wins: 1-0
# If black wins: 0-1
# If game drawn: 1/2-1/2

Producción:

White's chess.com Username: urvishmhjn
Black's chess.com Username: yannickhs
Game's Time Control: 900+10 seconds
Game Result: 1-0

Podemos obtener el FEN (FEN es una notación de texto utilizada para mostrar la posición de cada pieza en un momento dado del juego) en cualquier posición del juego con el siguiente código.

Python3

# The move number for which we want the FEN
move_number = 8
  
# Go through each move in the game until
# we reach the required move number
for number, move in enumerate(game.mainline_moves()):
      
    # It copies the move played by each 
    # player on the virtual board
    board.push(move)
      
    # Remember that number starts from 0
    if number == move_number:  
        break
  
fen = board.fen()
print(fen)

Producción:

r1bq1rk1/pp2bppp/4p3/3pn2n/2pP4/2P1PN2/PP1NBPPP/R2Q1RK1 w – – 0 11

Si desea visualizar el tablero de ajedrez, puede imprimir el tablero en la terminal.

Python3

print(board)

Producción:

r n b q k b . r
p p . . . p p p
. . . . p n . .
. . p p . . . .
. . . P . B . .
. . P B P . . .
P P . . . P P P
R N . Q K . N R

Nota: si desea una visualización real del tablero de ajedrez, en lugar de una impresión en la terminal, use Jupyter Notebook . La salida en Jupyter Notebook será algo como esto.

Python3

display(board)

Tablero de ajedrez en Jupyter Notebook

Publicación traducida automáticamente

Artículo escrito por urvishmahajan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *