13-07-2018, 07:33 PM
hola,
estoy revisando el codigo de un parser de partidas de ajedrez a fin de reducir cantidad de codigo y mejorar la rapidez del proceso.
se trata de leer un fichero con cierto numero de partidas, que están grabadas en ascii de la siguiente manera:
en este caso hay solo dos partidas, pero pueden existir miles de ellas.
El problema que tengo es que no encuentro el fin del fichero (EOF) y me repite indefinidamente la última partida.
Pongo el código:
Estoy casi seguro de que es solo cuestión de algún detalle tonto, pero llevo dos días con esto y no logro atinar.
¿Alguien me puede indicar donde puede esta el error?. Gracias anticipadas.
edito:
Lo de la repetición infinita de la ultima partida está arreglado (lo he visto justo al revisar el post
se trataba de sustituir self.end por self.fin (cosa de manejar indistintos idiomas)
ahora la salida que me reporta es un bucle infinito con None:
se puede solucionar dentro del for en main con un
if parti is not None:
print (parti)
else:
break
pero tengo que tener un error en las clases que no encuentro
estoy revisando el codigo de un parser de partidas de ajedrez a fin de reducir cantidad de codigo y mejorar la rapidez del proceso.
se trata de leer un fichero con cierto numero de partidas, que están grabadas en ascii de la siguiente manera:
Código:
[Event "Partida 1"]
[Site "Sitio 1"]
[Date "1992.11.04"]
[Round "1"]
[White "Fischer, Robert J."]
[Black "Spassky, Boris V."]
[Result "1/2-1/2"]
1. e4 e5 2. Nf3 Nc6 3. Bb5 {This opening is called the Ruy Lopez.} 3... a6
4. Ba4 Nf6 5. O-O Be7 1/2-1/2
[Event "Partida 2"]
[Site "Sitio 2"]
[Date "1992.11.04"]
[Round "2"]
[White "Fischer, Robert J."]
[Black "Spassky, Boris V."]
[Result "1/2-1/2"]
1. e4 e5 2. Nf3 Nc6 3. Bb5 {This opening is called the Ruy Lopez.} 3... a6
4. Ba4 Nf6 5. O-O Be7 1/2-1/2
El problema que tengo es que no encuentro el fin del fichero (EOF) y me repite indefinidamente la última partida.
Pongo el código:
Código:
# python 3.6.1
class IteradorPartidaCadena(object):
"""
Iterador que contiene cadenas multilínea que
representan partidas de un archivo PGN
"""
def __init__(self, nom_fich):
"""
Args:
nom_fich (str): PGN nombre fichero
"""
self.nom_fich = nom_fich
self.fich_iter = iter(open(self.nom_fich))
self.lineas_partida = []
self.fin = False
def __iter__(self):
"""iterador"""
return self
def __next__(self):
"""siguiente del iterador"""
if self.fin is True:
# raise StopIteration # python 2.7
return # python 3.5
try:
while True:
linea = next(self.fich_iter)
if linea.startswith("[Event"):
if len(self.lineas_partida) == 0:
self.lineas_partida.append(linea)
continue
else:
lineas_partida = self.lineas_partida[:]
self.lineas_partida = []
self.lineas_partida.append(linea)
partida_cadena = "".join(lineas_partida)
return partida_cadena
else:
self.lineas_partida.append(linea)
except StopIteration:
lineas_partida = self.lineas_partida[:]
partida_cadena = "".join(lineas_partida)
#print(117, partida_cadena)
self.end = True
return partida_cadena
class IteradorPartida(object):
"""
Iterador que contiene partidas de un archivo PGN
"""
def __init__(self, nom_fich):
"""
Args:
nom_fich (str): fichero.pgn (nombre del fichero)
"""
self.iterador_partida_str = IteradorPartidaCadena(nom_fich)
def __iter__(self):
"""iterador"""
return self
def __next__(self):
"""siguiente"""
for parti_str in self.iterador_partida_str:
return parti_str
if __name__ == '__main__':
for parti in IteradorPartida("comentarios.pgn"):
print(parti)
Estoy casi seguro de que es solo cuestión de algún detalle tonto, pero llevo dos días con esto y no logro atinar.

¿Alguien me puede indicar donde puede esta el error?. Gracias anticipadas.
edito:
Lo de la repetición infinita de la ultima partida está arreglado (lo he visto justo al revisar el post

se trataba de sustituir self.end por self.fin (cosa de manejar indistintos idiomas)
ahora la salida que me reporta es un bucle infinito con None:
Código:
[Event "Partida 1"]
[Site "Sitio 1"]
[Date "1992.11.04"]
[Round "1"]
[White "Fischer, Robert J."]
[Black "Spassky, Boris V."]
[Result "1/2-1/2"]
1. e4 e5 2. Nf3 Nc6 3. Bb5 {This opening is called the Ruy Lopez.} 3... a6
4. Ba4 Nf6 5. O-O Be7 1/2-1/2
[Event "Partida 2"]
[Site "Sitio 2"]
[Date "1992.11.04"]
[Round "2"]
[White "Fischer, Robert J."]
[Black "Spassky, Boris V."]
[Result "1/2-1/2"]
1. e4 e5 2. Nf3 Nc6 3. Bb5 {This opening is called the Ruy Lopez.} 3... a6
4. Ba4 Nf6 5. O-O Be7 1/2-1/2
None
...
None
...
if parti is not None:
print (parti)
else:
break
pero tengo que tener un error en las clases que no encuentro