きゃっとぐるーぶ

忘れてもいいようにメモを取っても、メモを取ったことを忘れる男の備忘録

将棋クラブ24の棋譜がshift_jisなのでまとめてutf-8に変換したい

将棋クラブ24では棋譜の一括ダウンロードをユーザーページから行える。ダウンロードするとzipファイルが落ちてくる。それはいいのだが、棋譜文字コードshift_jisなのでwindowsユーザーではない私の環境には適さない。そのため、一括で変換してしまうことにした。変換したファイルは再度zipにしておくことにした。もっとスッキリしたコードにしたい。これも練習。

import tempfile
import shutil
import codecs
import os
import sys
from pathlib import Path

base_path = Path(os.environ.get('HOME'))

def open_archive(src_dir, zip_file):
    shutil.unpack_archive(str(zip_file), src_dir.name)

def make_archive(dst_dir, zip_file):
    os.chdir(dst_dir.name)
    filename = 'utf8_' + zip_file.stem
    new_zip_file = base_path / filename
    shutil.make_archive(base_name=str(new_zip_file), format='zip')

def to_utf8(src, dst):
    sf = codecs.open(src, 'r', encoding='shift_jis')
    uf = codecs.open(dst, 'w', encoding='utf-8')
    for line in sf:
        uf.write(line)
    sf.close()
    uf.close()

def convert_run(src_dir, dst_dir, zip_file):
    open_archive(src_dir, zip_file)

    files_dir = Path(src_dir.name)
    new_files_dir = Path(dst_dir.name)

    for fname in files_dir.iterdir():
        to_utf8(fname, new_files_dir.joinpath(fname.name))

    return True

def main():
    zip_file = Path(sys.argv[-1])
    if zip_file:
        src_dir = tempfile.TemporaryDirectory()
        dst_dir = tempfile.TemporaryDirectory()

        ret = convert_run(src_dir, dst_dir, zip_file)
        if ret:
            make_archive(dst_dir, zip_file)
            src_dir.cleanup()
            dst_dir.cleanup()

if __name__ == '__main__':
    main()

みんなのPython 第4版

みんなのPython 第4版