Pythonでディレクトリを階層ごと作成する:os.makedirsの使い方とexist_okオプション

ファイルを出力する際、保存先のディレクトリ(フォルダ)がまだ存在しない場合、事前に作成しておく必要があります。

Pythonの標準ライブラリ os モジュールには、ディレクトリを作成するための関数として os.mkdir()os.makedirs() の2つが用意されています。特に os.makedirs() は、深い階層のディレクトリを一括で作成できるため非常に便利です。

この記事では、os.makedirs() の基本的な使い方と、ディレクトリが既に存在する場合のエラー回避方法について解説します。

目次

1. 深い階層を一気に作成する: os.makedirs()

os.makedirs() 関数を使用すると、指定したパスに含まれる途中のディレクトリ(親ディレクトリ)が存在しない場合でも、それらをすべて自動的に作成してくれます(再帰的な作成)。

構文:

import os

os.makedirs(作成したいパス)

具体的な使用例

「プロジェクト」フォルダの中に「データ」フォルダを作り、さらにその中に「ログ」フォルダを作る、というような深い階層を一度に作成します。

import os

# 作成したい階層構造のパス
# (カレントディレクトリの下に project/data/logs を作る)
log_dir_path = os.path.join("project", "data", "logs")

print(f"作成対象: {log_dir_path}")

try:
    # 階層ごと一括作成
    os.makedirs(log_dir_path)
    print("ディレクトリを作成しました。")
except FileExistsError:
    print("ディレクトリは既に存在します。")

実行結果: project フォルダ、その中の data フォルダ、さらにその中の logs フォルダが全て作成されます。

2. 既に存在する場合のエラーを防ぐ (exist_ok=True)

デフォルトでは、作成しようとしたディレクトリが既に存在していると、FileExistsError というエラーが発生してプログラムが停止します。

しかし、実務では「なければ作る、あれば何もしない(既存のものを使う)」という挙動が望ましいケースがほとんどです。

Python 3.2以降では、引数 exist_ok=True を指定することで、ディレクトリが既に存在していてもエラーにならず、そのまま処理を続行できるようになりました。

import os

# バックアップ用ディレクトリ
backup_dir = "backup_storage"

# exist_ok=True を指定
# 既にあってもエラーにならず、なければ新規作成される
os.makedirs(backup_dir, exist_ok=True)

print(f"'{backup_dir}' の準備が完了しました。")

このオプションを使うことで、try-except ブロックで FileExistsError を捕捉する必要がなくなり、コードが簡潔になります。

3. os.mkdir() との違い

似た名前の関数に os.mkdir() がありますが、こちらは**「1階層だけの作成」**に特化しています。

  • os.makedirs("a/b/c"): abc も作ります。
  • os.mkdir("a/b/c"): 親ディレクトリである a/b が既に存在している必要があります。存在しない場合は FileNotFoundError になります。
import os

# 親ディレクトリがない状態で mkdir を使うとエラーになる例
target = os.path.join("new_folder", "sub_folder")

try:
    os.mkdir(target)
except FileNotFoundError:
    print("エラー: 親ディレクトリが存在しないため mkdir では作成できません。")

まとめ

  • os.makedirs(path): 親ディレクトリを含めて再帰的にディレクトリを作成します。通常はこちらを使用するのが便利です。
  • exist_ok=True: これを指定すると、ディレクトリが既に存在していてもエラーになりません(推奨)。
  • os.mkdir(path): 最下層のディレクトリを1つだけ作成します。親ディレクトリが存在している必要があります。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次