KATOエンジニヤリング開発日誌

「アウトプット無きエンジニアにインプットもチャンスも無い」の精神で書いています

KABU+で取得したCSVファイルを定期的に圧縮する

前回KABU+で株価データのCSVファイルを取得しましたが、そのまま保管しているとサーバーのストレージ容量を圧迫してしまうので年月ごとにzip形式で圧縮するスクリプトを作成しました。

www.kato-eng.info

スクリプトの構成

今回もスクリプトはPythonで作成しました。

ディレクトリ構成は下記の通りです。

  • スクリプトファイル
    • /[適当なrootディレクトリ]/script/compression_file/compression_japan_all_stock.py
  • ダウンロードしたCSVファイルが格納されている場所
    • /[適当なrootディレクトリ]/data/japan_all_stock_prices/
  • 圧縮したファイルの格納場所とファイル名
    • /[適当なrootディレクトリ]/data/japan_all_stock_prices/japan-all-stock-prices_YYYYMM.zip
      • 「YYYYMM」は対象ファイルの年月が入る(例:2018年11月は「201811」)

「compression_japan_all_stock.py」が起動スクリプトで、起動した年月の1ヶ月前の月のCSVファイルをまとめて圧縮してCSVファイルが格納されているディレクトリにzipファイルを置くことにしました。

スクリプト

#coding:utf-8

import sys
import os
import glob
import shutil
import datetime
from dateutil.relativedelta import relativedelta

args = sys.argv
BASE_DIR = '/usr/local/script/compression_file/'
TARGET_DIR = BASE_DIR + "../../data/japan_all_stock_prices/"
FILE_NAME_PREFIX = 'japan-all-stock-prices_'

def move_glob(dst_path, pathname, recursive=True):
    for p in glob.glob(pathname, recursive=recursive):
        shutil.move(p, dst_path)


if __name__ == '__main__':
    # 対象の年月を設定
    if len(args) < 2:
        TODAY = datetime.date.today()
        one_month_ago = TODAY - relativedelta(months=1)
        target_month = str(one_month_ago.year) + str(one_month_ago.month)
    else:
        target_month = args[1]

    target_file_list = list()
    try:
        # YYYYmm形式のディレクトリ作成
        target_month_dir = TARGET_DIR + target_month
        os.makedirs(target_month_dir, exist_ok=True)
        # 対象ファイルを作成したディレクトリに移動
        move_from = TARGET_DIR + FILE_NAME_PREFIX + target_month + '*.csv'
        move_to = target_month_dir
        move_glob(move_to, move_from)
        # 対象ファイルを格納したディレクトリをzip圧縮する
        archived_file = TARGET_DIR + FILE_NAME_PREFIX + target_month
        archive_format = 'zip'
        shutil.make_archive(archived_file, archive_format, TARGET_DIR[:-1], target_month)
        # 圧縮が成功したら圧縮前のディレクトリに格納されているファイルをディレクトリごと削除する
        if os.path.isfile(archived_file + '.zip'):
            shutil.rmtree(move_to)

    except shutil.Error as e:
        print(e)
        sys.exit(1)

    sys.exit(0)

起動時に引数を与えない場合は前述の通り起動年月の前月のCSVファイルを対象とします。起動時に「201701」のような形式で引数を与えると、その年月のCSVファイルを対象とします。

実際にスクリプトを起動するとCSVファイル格納ディレクトリからファイルが消え、zipファイルが作成されていることが確認できます。

f:id:masayuki_kato:20181120000137p:plain