趣味の学習ノート

IT関連の学習や開発の記録など。

【Python】月毎のフォルダとその中身のフォルダをまとめて生成する

ローカルにフォルダをまとめて作りたくて、Pythonでサクッと書いてみた。

パスの扱いと、フォルダの作成について簡単にまとめ。

やりたいこと

こんな風に一年分の月ごとのフォルダ群を作りたい。

指定した親フォルダの直下に

  • まず2022.01〜2022.12と年月の数字が入ったフォルダがあり
  • その各フォルダに「請求書」「売上精算書」「領収書」…などといった空のフォルダがある

というもの。

年月のフォルダを一つ作ってコピーして名前を変えていけば作れるけど、地味にめんどい。

スクリプト

スクリプト全体はこちら。

import os
from pathlib import Path 

"""パラメータ"""
TARGET_DIR_PATH = Path('<パス文字列>') # フォルダ群を作成したい親フォルダ
YEAR = 2022 # 年
CATEGORIES = ('領収書', '請求書', '売上精算書') # 作成するフォルダ名

def create_folders():
    """
    TARGET_DIR_PATHで指定した親フォルダの中に「2022.01」のような月毎のフォルダを一年分生成し、
    さらにその中にCATEGORIESで指定したフォルダ群を作成する
    """
    for i in range(1, 13):
        year_month = f'{str(YEAR)}.{str(i).zfill(2)}' # ピリオド区切り・月はゼロ埋め。例)2022.01
        for category in CATEGORIES:
            new_path = TARGET_DIR_PATH / year_month / category
            os.makedirs(new_path)

if __name__ == '__main__':
    create_folders()

解説

ユーザーが指定するパラメータ

スクリプトの中のパラメータの部分を、自身の環境と作成したいフォルダに合わせて書き換えて使う。

"""パラメータ"""
TARGET_DIR_PATH = Path('<パス文字列>') # フォルダ群を作成したい親フォルダ
YEAR = 2022 # 年
CATEGORIES = ('領収書', '請求書', '売上精算書') # 作成するフォルダ名

このTARGET_DIR_PATHに指定するフォルダパスは絶対パスにしておくと、Pythonスクリプトを実行した時のフォルダが違っても毎回同じ場所に作成されるので、個人的にはおすすめ。

ファイル・フォルダのパスを扱う

パスを扱うにはpathlibモジュールのPathクラスを使うと便利。
Path('<パスを表す文字列>')でPathオブジェクトを作成すると、パスオブジェクトとファイル名文字列を/で連結できてスッキリする。

from pathlib import Path 
(略)

TARGET_DIR_PATH = Path('test') 
(略)
new_path = TARGET_DIR_PATH / year_month / category

フォルダを再帰的に作成する

フォルダを作成するにはosモジュールのos.makedirs(<フォルダパス>)を使うと、引数に指定したフォルダパスを深い階層まで一気に作成することができる。
(これを「再帰的」というらしい)

この時、引数に指定するパスが存在しなくても自動で生成してくれる。
ただしパスが既に存在する場合はエラーが返ってきてしまうため、その場合はオプション引数でexist_ok=Trueを指定するとよい。この場合はフォルダ自体が上書きされてしまうので、中に重要なデータが入っていないことを確認して実行するようにしよう。 (※2023/05/19訂正:フォルダの中にファイルが入っていても消えないので大丈夫そう)

import os
(略)

new_path = TARGET_DIR_PATH / year_month / category
os.makedirs(new_path)

似たようなフォルダを作成する関数にos.mkdir()があるが、こちらは引数として存在しているフォルダを指定しないとエラーになってしまう。なので今回のような使い方ができない。

note.nkmk.me

まとめ

パスの扱いと、フォルダの作成について簡単にまとめた。

ローカルのファイル、フォルダをいじるときにPythonはすごく便利。