提取由空行包围的文件块

时间:2017-02-02 03:49:25

标签: python file-io extract

我正在尝试提取给定文件中每个[EventDate]标记后面的代码块。这些都以1开头,并以不同的数字结束。以下示例从1开始,结束于46和50 ..每个文件中有多于2个。

这样做的目的是计算每个代码块有多少移动。在这种情况下,第一个块为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 个答案:

答案 0 :(得分:1)

您提供的两款游戏的样本实际上是一种称为PGN(便携式游戏符号)的标准化格式。您可以在wikipedia PGN article上详细了解相关信息。这很重要,因为pgn的python解析器已存在于pypi here上列出的名为pgnparser的库中。如果您对安装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.

如果您的目标是计算移动次数,那么这将是一种高效,干净且面向对象的方式。