Python | ファイル・OS 操作:mkdir(parents=True)

Python Python
スポンサーリンク

概要(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)
Python

parents=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系)
Python

OSや既存 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)である点も覚えておく。これらを習慣化すれば、ファイル出力やログ保存で「フォルダがなくて落ちる」事故がほぼ消え、安定したコードになります。

タイトルとURLをコピーしました