概要(mkdir(parents=True) は「途中の親も含めて安全に作る」ための一手)
pathlib の Path.mkdir はディレクトリを作るメソッドです。parents=True を付けると、まだ存在しない親ディレクトリもまとめて作ってくれます。これで「途中のフォルダがないせいで失敗する」典型的なエラーを避けられます。さらに exist_ok=True を組み合わせると「既にあるなら何もしない」で安全に実運用できます。
基本の使い方(ここが重要)
単純な作成と、親ごと作成の違い
from pathlib import Path
# 単一ディレクトリ(親が既にある前提)
Path("data").mkdir()
# 親ごと作成(data/logs/2025 を丸ごと用意)
Path("data/logs/2025").mkdir(parents=True)
Pythonparents=False(デフォルト)のままだと、途中の親が無いとエラーになります。最初から階層を作る可能性があるなら parents=True を選びましょう。
既存でもエラーにしない(exist_ok=True)
Path("data/logs/2025").mkdir(parents=True, exist_ok=True)
Python本番やスクリプトの繰り返し実行では「既存ならそのまま」が安全です。exist_ok=True を習慣化すると例外を減らせます。
重要ポイントの深掘り(失敗しない設計・権限・絶対/相対)
「作る前の結合」と「作った後の利用」を分離する
from pathlib import Path
base = Path("data")
out_dir = base / "logs" / "2025"
out_dir.mkdir(parents=True, exist_ok=True) # 作成はここまで
log = out_dir / "access.log" # 以降は利用
log.write_text("start\n", encoding="utf-8")
Python結合→作成→利用を段階化すると、パスの間違いと作成漏れを防げます。
権限(mode)の指定は後から整えるのが現実的
p = Path("secure")
p.mkdir(parents=True, exist_ok=True) # まず作る
p.chmod(0o700) # 後から権限を整える(UNIX系)
PythonOSや既存 umask の影響があるため、作成直後に chmod で意図した権限へ調整する方がわかりやすいです。
相対・絶対・ホームの扱いを明確に
from pathlib import Path
# カレント基準(相対)
rel = Path("data/reports")
# 絶対
abs_path = Path("/var/tmp/app") # Windowsなら "C:/Users/..." 等
# ホーム配下(~ 展開)
home = Path("~").expanduser()
docs = home / "Documents" / "notes"
docs.mkdir(parents=True, exist_ok=True)
Python「どこに作るか」を明示すると、環境が変わっても破壊的な誤作成を避けられます。
実務での使いどころ(出力先準備・テンポラリ・日付別ログ)
出力先を必ず先に用意する(親を作ってから書く)
from pathlib import Path
out = Path("build/artifacts/report.txt")
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text("done\n", encoding="utf-8")
Pythonファイル書き込み前に親を作るのが鉄則。例外が激減します。
テンポラリやワークディレクトリの初期化
from pathlib import Path
work = Path.cwd() / "tmp" / "session_001"
work.mkdir(parents=True, exist_ok=True)
Python作業領域を毎回用意するパターン。parents=True で失敗しない基盤を作ります。
日付階層でログ保存
from pathlib import Path
from datetime import date
base = Path("logs")
day = date.today().strftime("%Y/%m/%d") # '2025/12/15' のような階層
folder = base / day
folder.mkdir(parents=True, exist_ok=True)
log = folder / "app.log"
log.write_text("start\n", encoding="utf-8")
Pythonよくある落とし穴の回避(存在チェック・例外・削除との関係)
exists() と is_dir() の違いを押さえる
p = Path("data")
if p.exists() and not p.is_dir():
raise RuntimeError("同名のファイルが存在して作成不能")
p.mkdir(parents=True, exist_ok=True)
Python「存在はするがディレクトリではない」ケースを先に弾くと、思わぬ上書きや例外を防げます。
作成と削除は対で考える(rmdir は空のみ)
p = Path("data/logs")
p.mkdir(parents=True, exist_ok=True)
# 空なら削除できる
try:
p.rmdir() # 中身があると OSError
except OSError:
pass
Python削除したい場合は中身を先に掃除する必要があります(再帰削除は shutil.rmtree を検討)。
失敗時の扱いを決める(権限・競合)
- 権限不足で作成できない場合の代替(場所変更、エラーメッセージ)
- 競合(別プロセスが同名ファイルを作った)への対策(is_dir チェック・リトライ)
例題で身につける(定番から一歩先まで)
例題1:親ディレクトリなしでの失敗と、parents=True での成功
from pathlib import Path
# 失敗例(親が無い想定)
try:
Path("a/b/c").mkdir() # FileNotFoundError
except Exception as e:
print("失敗:", type(e).__name__)
# 成功例(親をまとめて作る)
Path("a/b/c").mkdir(parents=True, exist_ok=True)
print("作成OK:", Path("a/b/c").is_dir())
Python例題2:ファイル書き込み前の安全な親作成
from pathlib import Path
out = Path("output/reports/summary.txt")
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text("summary\n", encoding="utf-8")
print(out)
Python例題3:ホーム配下へ保存(~ 展開+作成)
from pathlib import Path
home = Path("~").expanduser()
save = home / "Documents" / "notes" / "memo.txt"
save.parent.mkdir(parents=True, exist_ok=True)
save.write_text("memo\n", encoding="utf-8")
Python例題4:存在するがディレクトリでない場合の防御
from pathlib import Path
target = Path("data")
if target.exists() and not target.is_dir():
raise RuntimeError("data はファイルのためディレクトリを作れません")
target.mkdir(parents=True, exist_ok=True)
Pythonまとめ
mkdir(parents=True) は「途中の親も含めて安全にディレクトリを用意する」ための実務必須テクニックです。exist_ok=True を組み合わせて再実行に強くし、結合→作成→利用の段階化でバグを減らす。相対・絶対・ホームを明示し、存在するがディレクトリでないケースを事前に弾く。削除は空のみ(rmdir)である点も覚えておく。これらを習慣化すれば、ファイル出力やログ保存で「フォルダがなくて落ちる」事故がほぼ消え、安定したコードになります。
