Help us understand the problem. What is going on with this article?

jsonファイルをパースして処理するサンプル

More than 1 year has passed since last update.

叡王戦で公開されている棋譜JSONをkif形式のファイルに変換するスクリプトを書いてみた。
いろいろ未完成で適当だがShougGUIで読み込めたのでまぁ良しとする。

python3 json2kif.py <URL> kif.json a.kif
json2kif.py
# -*- coding: utf-8 -*-
from logging import getLogger, StreamHandler, DEBUG

import sys
import os
import json
import unicodedata
import re
import urllib.request

# ログ出力のための print と import logging はやめてほしい - Qiita
# https://qiita.com/amedama/items/b856b2f30c2f38665701

logger = getLogger(__name__)
handler = StreamHandler()
handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
logger.addHandler(handler)
logger.propagate = False


class FileWriter:
    filename = None
    tiow = None

    def __init__(self, fname):
        self.filename = fname
        self.tiow = open(self.filename, mode='a', encoding="utf-8")

    def write(self, msg):
        self.tiow.write(msg + "\n")

    def __del__(self):
        self.tiow.close()


def file_download(url, filename):
    """
    :param url:
    :param filename:
    :return:
    """
    urllib.request.urlretrieve(url, filename)


def get_east_asian_width_count(text):
    """
    Pythonで半角1文字、全角2文字として文字数(幅)カウント | note.nkmk.me
    https://note.nkmk.me/python-unicodedata-east-asian-width-count/

    :param text:
    :return:
    """
    count = 0
    for c in text:
        if unicodedata.east_asian_width(c) in 'FWA':
            count += 2
        else:
            count += 1
    return count


def space_ume(text):
    """
    12byteまで半角スペースで埋める
    :param text:
    :return:
    """
    for i in range(10):
        if get_east_asian_width_count(text) >= 12:
            break
        text = "{} ".format(text)
    return text


def main():
    args = sys.argv
    url = args[1]
    json_path = args[2]
    kif_path = args[3]

    file_download(url, json_path)

    # json.loadsでjsonを読み込み、for ループで特定の要素を抜き出すサンプル - Database JUNKY
    # https://hit.hateblo.jp/entry/python3/json
    f = open(json_path, 'r', encoding="utf-8")
    json_dict = json.load(f)

    if os.path.exists(kif_path):
        os.remove(kif_path)
    tiow = FileWriter(kif_path)

    outlist = list(['# --- 棋譜解説 V1.70 棋譜ファイル ---'])
    outlist.append("開始時刻:{}".format(json_dict['data'][0]['starttime']))
    outlist.append("終了時刻:{}".format(json_dict['data'][0]['endtime']))
    outlist.append("棋戦:{}".format(json_dict['data'][0]['event']))
    outlist.append("持ち時間:{}時間".format(json_dict['data'][0]['timelimit']))
    outlist.append("場所:{}".format(json_dict['data'][0]['place']))
    outlist.append("備考:{}".format(json_dict['data'][0]['note'].strip()))
    outlist.append("振り駒:あり")
    outlist.append("計測時方式:{}".format(json_dict['data'][0]['gametype']))
    outlist.append("秒読み:{}".format(json_dict['data'][0]['countdown']))
    dinnertime_start = json_dict['data'][0]['dinnertime_start']
    dinnertime_end = json_dict['data'][0]['dinnertime_end']
    outlist.append("夕食休憩:{}~{}".format(dinnertime_start, dinnertime_end))
    outlist.append("封じ手手数:0")
    outlist.append("手合割:{}".format(json_dict['data'][0]['handicap']))
    outlist.append("先手:{}".format(json_dict['data'][0]['player1']))
    outlist.append("後手:{}".format(json_dict['data'][0]['player2']))
    outlist.append("手数----指手---------消費時間--")

    for item in outlist:
        tiow.write(item)

    for key in json_dict['data'][0]['kif']:
        move = key['move']

        # 左成、右成から左右を削除
        # move.replace('左', '') # これは効かない
        move = re.sub(r'左', '', move)
        move = re.sub(r'右', '', move)

        if move == "投了":
            break

        if len(move) == 2:
            m = move
            m = "{}{}{}".format(m[:1], " ", m[1:])
            move = m

        if key['frY'] == 0 or key['frY'] == 10:
            move = "{}{}".format(move, "打")
        else:
            xy = key['frX'] * 10 + key['frY']
            move = "{}({})".format(move, xy)

        move = space_ume(move)

        tiow.write("{:4d} {:<8} ({})".format(key['num'], move, " 0:00/00:00:00"))


if __name__ == "__main__":
    main()

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away