skip to content
barorin&

Pythonのファイル・パス操作まとめ|フォルダ作成・glob・自然順ソート・.env

/ 6 min read

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.txt

natsort を使うと、人間が期待する順序で並びます。

Terminal window
$ pip install natsort
from 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.local

python-dotenv でパスを明示的に指定します。

Terminal window
$ pip install python-dotenv
func.py
import os
from pathlib import Path
from 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 のまま処理が進み、原因の分かりにくいエラーになります。

おわりに

ファイル操作は ospathlib のどちらでも書けますが、パスの結合や親ディレクトリの参照は pathlib のほうが読みやすくなります。新しく書くなら pathlib に寄せておくと、あとから読み返したときに分かりやすいです。

この記事を書いた人

barorinのプロフィール画像

barorin公認会計士

会計とITの二足のわらじで働く公認会計士です。Pythonを中心に、会計・監査の実務で実際に使っているコードや、Ubuntu・Raspberry Piの設定メモを書いています。