2017-02-02 7 views
0

Я пытаюсь извлечь блоки кода, которые следуют за каждым тегом [EventDate] в данном файле. Все это начинается с 1. и заканчивается переменными числами. Приведенные ниже примеры начинаются с 1. и заканчиваются на 46. и 50 .. В каждом файле содержится больше двух.Извлечь блоки файла в окружении пустых строк

Целью этого является подсчет количества перемещений каждого блока кода. В этом случае 46 для первого блока и 50 для второго. Как только я извлечу блоки, я смогу считать периоды «.». чтобы получить общее количество ходов.

[Event "9th Masters Final 2016"] 
[Site "Bilbao ESP"] 
[Date "2016.07.13"] 
[Round "1.1"] 
[White "Karjakin, Sergey"] 
[Black "So, Wesley"] 
[Result "1/2-1/2"] 
[WhiteTitle "GM"] 
[BlackTitle "GM"] 
[WhiteElo "2773"] 
[BlackElo "2770"] 
[ECO "C65"] 
[Opening "Ruy Lopez"] 
[Variation "Berlin defence"] 
[WhiteFideId "14109603"] 
[BlackFideId "5202213"] 
[EventDate "2016.07.13"] 

1. e4 e5 2. Nf3 Nc6 3. Bb5 Nf6 4. d3 Bc5 5. c3 O-O 6. O-O d6 7. h3 Ne7 8. d4 Bb6 
9. Bd3 Ng6 10. Re1 Re8 11. Nbd2 c6 12. Nf1 d5 13. Bg5 dxe4 14. Rxe4 h6 15. Bxf6 
Qxf6 16. Re3 Bf5 17. Bxf5 Qxf5 18. Ng3 Qd7 19. Nxe5 Nxe5 20. Rxe5 Rxe5 21. dxe5 
Qe7 22. Qh5 g6 23. Qe2 Qg5 24. Kf1 Kf8 25. Re1 Re8 26. Qd3 Rxe5 27. Qd6+ Re7 28. 
Ne4 Qf5 29. Re2 Bc7 30. Qd4 Qe5 31. Qxa7 Qh2 32. Ng3 Bxg3 33. Rxe7 Qh1+ 34. Ke2 
Kxe7 35. Qe3+ Kf6 36. Qxg3 Qb1 37. Qf4+ Kg7 38. Qd4+ Kg8 39. Qb4 Qxa2 40. Qxb7 
Qc4+ 41. Ke3 Qc5+ 42. Kf3 Qd5+ 43. Kg3 Qg5+ 44. Kh2 Qf4+ 45. Kg1 Qc1+ 46. Kh2 
Qf4+ 1/2-1/2 

[Event "9th Masters Final 2016"] 
[Site "Bilbao ESP"] 
[Date "2016.07.13"] 
[Round "1.2"] 
[White "Carlsen, Magnus"] 
[Black "Nakamura, Hikaru"] 
[Result "0-1"] 
[WhiteTitle "GM"] 
[BlackTitle "GM"] 
[WhiteElo "2855"] 
[BlackElo "2787"] 
[ECO "B20"] 
[Opening "Sicilian"] 
[Variation "Keres variation (2.Ne2)"] 
[WhiteFideId "1503014"] 
[BlackFideId "2016192"] 
[EventDate "2016.07.13"] 

1. e4 c5 2. Ne2 d6 3. Nbc3 a6 4. g3 g6 5. Bg2 Bg7 6. d4 cxd4 7. Nxd4 Nf6 8. O-O 
O-O 9. b3 Nc6 10. Nxc6 bxc6 11. Bb2 Qa5 12. Na4 Bg4 13. Qe1 Qh5 14. f3 Bh3 15. 
g4 Qh6 16. Rd1 g5 17. Bc1 Bxg2 18. Kxg2 Qg6 19. h4 gxh4 20. Qxh4 d5 21. g5 dxe4 
22. f4 e6 23. c4 Rfd8 24. Rde1 Ne8 25. Nc5 Nd6 26. Qf2 f5 27. Bb2 Nf7 28. Bxg7 
Kxg7 29. Qg3 Rd6 30. Rd1 Rad8 31. Rxd6 Rxd6 32. Qc3+ Kg8 33. Rf2 Qh5 34. Qh3 Qd1 
35. Qe3 e5 36. Qg3 Rg6 37. Kh2 exf4 38. Qxf4 Qh5+ 39. Kg1 Qd1+ 40. Kh2 Qh5+ 41. 
Kg1 Nxg5 42. Qb8+ Kg7 43. Qe5+ Kh6 44. Qf4 Qd1+ 45. Kh2 Qd4 46. b4 Kg7 47. Qc7+ 
Kh8 48. Qc8+ Rg8 49. Qxf5 Nf3+ 50. Kh3 Qd6 0-1 

ответ

1

Образец двух игр, которые вы предоставили, на самом деле является стандартизованным форматом, известным как PGN (Portable Game Notation). Вы можете узнать больше об этом на wikipedia PGN article. Это важно, потому что парсер python для pgn уже существует в библиотеке, известной как pgnparser, которая указана на pypi here. Если вам удобно устанавливать библиотеку pgnparser, вы можете сделать эту задачу довольно тривиальной. Сама установка выполняется так же просто, как запуск pip install pgnparser, если ваша установка python уже настроена с pip. Я предполагаю, что вы установили библиотеку pgnparser, а также свои два примера игр в файл example_games.pgn.

import pgn # The pgnparser library. 

with open('example_games.pgn') as f: 
    games = pgn.loads(f.read()) 

print(games) 

, который будет печатать игры в файле

[<PGNGame "Karjakin, Sergey" vs "So, Wesley">, 
<PGNGame "Carlsen, Magnus" vs "Nakamura, Hikaru">] 

Чтобы получить счетчик ходов в каждой игре, просто перебирать их

for game in games: 
    msg = "{} vs {}, {} moves." 
    print(msg.format(game.white, game.black, len(game.moves))) 

Это печатает хороший резюме каждой игры в файле.

Karjakin, Sergey vs So, Wesley, 93 moves. 
Carlsen, Magnus vs Nakamura, Hikaru, 101 moves. 

Если ваша цель состоит в том, чтобы получить счетчик ходов, это будет эффективный, чистый и объектно-ориентированным способ сделать это.