Table of Contents
はじめに
複数のファイルをまとめて処理するスクリプトを書くと、必ずファイルとパスの操作が出てきます。毎回書き方を調べ直しがちなものをまとめました。
フォルダを作成する(存在チェック付き)
すでにフォルダがあるとエラーになるので、事前に確認するコードをよく見かけます。
import os
if not os.path.isdir("new_folder"): os.makedirs("new_folder")ただし、exist_ok=True を付ければ判定は不要です。
import os
os.makedirs("new_folder", exist_ok=True)すでに存在していてもエラーにならず、そのまま処理を続けられます。
pathlib を使うと、より読みやすく書けます。
from pathlib import Path
Path("output/2026-08").mkdir(parents=True, exist_ok=True)parents=True は「途中の階層もまとめて作る」という指定です。output が無くても output/2026-08 まで一度に作成されます。
globで複数の拡張子のファイルを集める
glob は1回に1つのパターンしか受け取れないので、複数の拡張子を集めたい場合は結果をつなげます。
import glob
files = glob.glob("*.htm")files.extend(glob.glob("*.html"))pathlib なら内包表記でまとめて書けます。
from pathlib import Path
p = Path(".")files = [f for ext in ("*.htm", "*.html") for f in p.glob(ext)]サブフォルダまで再帰的に探す場合は ** を使います。
# glob の場合は recursive=True が必要files = glob.glob("data/**/*.csv", recursive=True)
# pathlib なら rglob が使えるfiles = list(Path("data").rglob("*.csv"))ファイル名を自然な順序で並べる
glob が返すファイルの順序は保証されていません。月次のファイルを順に処理したいときに困ります。
files = glob.glob("./*.txt")for file in files: print(file)
# ./2022-05.txt# ./2022-06.txt# ./2022-04.txtnatsort を使うと、人間が期待する順序で並びます。
$ pip install natsortfrom natsort import natsorted
files = glob.glob("./*.txt")for file in natsorted(files): print(file)
# ./2022-04.txt# ./2022-05.txt# ./2022-06.txt別のフォルダにある .env を読み込む
次のような構成で、func.py から一つ上の .env.local を読みたい場合です。
app/├ func/│ └ func.py└ .env.localpython-dotenv でパスを明示的に指定します。
$ pip install python-dotenvimport osfrom pathlib import Pathfrom dotenv import load_dotenv
# このファイルの場所を基準に、一つ上の .env.local を指すdotenv_path = Path(__file__).parent.parent / ".env.local"load_dotenv(dotenv_path)
USER = os.environ["USER"]値の取得方法は2通りあり、挙動が違います。
# キーが無ければ KeyError で止まるUSER = os.environ["USER"]
# キーが無ければ None(既定値も指定できる)USER = os.getenv("USER", "default_user")**必須の設定値は os.environ[] で取得するのが安全です。**設定漏れがあれば起動時点で気づけます。os.getenv() だと None のまま処理が進み、原因の分かりにくいエラーになります。
おわりに
ファイル操作は os と pathlib のどちらでも書けますが、パスの結合や親ディレクトリの参照は pathlib のほうが読みやすくなります。新しく書くなら pathlib に寄せておくと、あとから読み返したときに分かりやすいです。
