pythonで棋譜データを扱う

棋譜データをpythonで読み込む方法についてのメモです。こちらのライブラリを使用させて頂いています。
GitHub - gunyarakun/python-shogi: A pure Python shogi library with move generation and validation and handling of common formats.

元となる棋譜データはCSA形式を想定しています。サンプルデータには「将棋DB2」のCSA形式ファイルを使用しました。
羽生善治 vs. 藤井猛 順位戦 - 無料の棋譜サービス 将棋DB2

サンプルコード

import shogi.CSA

kif = shogi.CSA.Parser.parse_file('test.csa')[0]

board = shogi.Board()
for move in kif['moves']:
    # どこからどこに移動したか USIプロトコル形式
    print(move)
    # 移動
    board.push_usi(move)

    # 盤面表示
    print(board) # テキスト形式(ASCII文字)
    print(board.kif_str()) # テキスト形式(KIFスタイル)

    # 占有している駒の位置 右下から左に移動という方向で表記されている
    print('{:0=81b}'.format(board.occupied[shogi.BLACK]))# 先手
    print('{:0=81b}'.format(board.occupied[shogi.WHITE]))# 後手
    
    # 先手の持ち駒 参考 : https://tadaoyamaoka.hatenablog.com/entry/2017/04/08/165742
    hand = board.pieces_in_hand
    hand_b = hand[shogi.BLACK]
    for p in hand_b.keys():
        print("piece: {0}, num: {1}".format(shogi.Piece(p, shogi.BLACK).symbol(), hand_b[p]))
        print("piece: {0}, num: {1}".format(shogi.Piece(p, shogi.BLACK).japanese_symbol(), hand_b[p]))

    print('-'*100)

USI形式について

駒の表記法、位置の表記法についてはこちらをご覧ください
将棋所:USIプロトコルとは

駒の表記法

盤面を表記するとき、1段目の左側(9筋側)から駒の種類を書いていきます。空白の升は、空白が続く個数の数字を書きます。
平手初期局面の場合、1段目は、左から後手の駒が香桂銀金玉金銀桂香と並んでいるので、lnsgkgsnlとなります。2段目は、空白が1升、後手の飛車、空白が5升、後手の角、空白が1升というように並んでいるので、1r5b1となります。

位置の表記法

指し手に関しては、駒の移動元の位置と移動先の位置を並べて書きます。7七の駒が7六に移動したのであれば、7g7fと表記します。(駒の種類を表記する必要はありません。)
駒が成るときは、最後に+を追加します。8八の駒が2二に移動して成るなら8h2b+と表記します。
持ち駒を打つときは、最初に駒の種類を大文字で書き、それに*を追加し、さらに打った場所を追加します。金を5二に打つ場合はG*5bとなります