ローカルにフォルダをまとめて作りたくて、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()
があるが、こちらは引数として存在しているフォルダを指定しないとエラーになってしまう。なので今回のような使い方ができない。
まとめ
パスの扱いと、フォルダの作成について簡単にまとめた。
ローカルのファイル、フォルダをいじるときにPythonはすごく便利。