ファイルを出力する際、保存先のディレクトリ(フォルダ)がまだ存在しない場合、事前に作成しておく必要があります。
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"):aもbもcも作ります。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つだけ作成します。親ディレクトリが存在している必要があります。
