はじめに (対象読者・この記事でわかること)
この記事は、Pythonでスクリプトを書く際に「実行ファイルと同じ名前のフォルダを自動作成し、その中に処理結果を保存したい」という方を対象としています。画像処理やCSV出力、ログファイル作成など、スクリプトごとに整理された出力先が欲しい場面で役立ちます。
読むことで、__file__やpathlibを使ったファイル・フォルダ操作の基礎と、実行ファイル名から拡張子を除去して同名フォルダを作成する実装方法が身につきます。サンプルコードはそのままコピペ&流用可能です。
前提知識
- Python 3.6以上(
pathlibを使うため) - ターミナル(コマンドプロンプト/PowerShell/Bash)でのPythonスクリプト実行経験
- 相対パス・絶対パスの基本概念
なぜ「ファイル名と同じフォルダ」が便利なのか
データ分析や画像変換、スクレイピングなど「1スクリプト1役」を基本に開発していると、出力ファイルがカレントディレクトリにどんどん増えて管理が煩雑になりがちです。「スクリプト名と同じフォルダを作ってそこに全部入れてしまえば、後からゴミ掃除が楽」というニーズは意外と多く、特に共同開発や納品時に評価されます。
Python標準ライブラリだけで完結し、OS依存を最小限に抑えられるため、Windows/macOS/Linuxすべてで同じコードが動きます。
実装手順:__file__とpathlibで同名フォルダを作成する
ステップ1:スクリプトの場所と名前を取得
Pythonインタープリタに読み込まれたスクリプトの絶対パスはグローバル変数__file__に格納されています。これをpathlib.Pathに変換すると、拡張子を除いた「ファイル名の部分」が簡単に取得できます。
Pythonfrom pathlib import Path # 実行中のスクリプトパスを絶対パスで取得 script_path = Path(__file__).resolve() # ファイル名(拡張子付き)→ stemで拡張子なし folder_name = script_path.stem # sample.py なら "sample" parent_dir = script_path.parent # スクリプトが置かれているフォルダ output_dir = parent_dir / folder_name # 同名フォルダのPathオブジェクト
ステップ2:フォルダがなければ作成、あればスルー
Path.mkdir(exist_ok=True)を使うと、既存フォルダが存在しても例外が出ません。
Pythonoutput_dir.mkdir(exist_ok=True) print(f"出力先: {output_dir}")
ステップ3:実際にファイルを保存してみる
例として、CSVとログを出力してみます。
Pythonimport csv, datetime, logging # ログ設定(フォルダ内にログファイルを置く) log_path = output_dir / f"{folder_name}.log" logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", handlers=[logging.FileHandler(log_path, encoding="utf-8")] ) # CSV出力例 csv_path = output_dir / "result.csv" with csv_path.open("w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["time", "value"]) writer.writerow([datetime.datetime.now().isoformat(), 42]) logging.info("CSV保存完了: %s", csv_path)
実行すると、スクリプトと同じ階層に「スクリプト名」フォルダができ、その中にresult.csvとスクリプト名.logが保存されます。
ステップ4:Jupyter Notebookでも動かす
Notebookでは__file__が存在しないため、代わりに__name__やget_ipython()で判定して対応します。
Pythonfrom pathlib import Path import IPython if IPython.get_ipython() is not None: # Jupyter環境 out_dir = Path.cwd() / "notebook_output" else: out_dir = Path(__file__).resolve().parent / Path(__file__).stem out_dir.mkdir(exist_ok=True)
ハマった点と対策
-
Windowsで
__file__が正しく取得できない
スクリプトをpython sample.pyではなくpython .\sampleと実行すると__file__が'.'になることがあります。必ずpython sample.pyまたはpython -m sampleで実行しましょう。 -
PyInstallerなどでパッケージ化したとき
凍結ビルドでは__file__がsys.executable側に変わります。以下のようにフォールバックすると安全です。
Pythonimport sys, os if getattr(sys, "frozen", False): script_path = Path(sys.executable) else: script_path = Path(__file__).resolve()
- 同名フォルダに既に別のファイルがある
上書き防止したい場合はoutput_dir.mkdir(exist_ok=False)にして例外をキャッチし、連番を付けるなどの対応を検討します。
まとめ
本記事では、Pythonスクリプトを実行したら「ファイル名と同じフォルダ」を自動作成し、その中に成果物を保存する方法を解説しました。
__file__とpathlib.Pathを組み合わせると、わずか数行で同名フォルダが作れるPath.mkdir(exist_ok=True)で既存フォルダを考慮した安全なコードが書ける- Jupyter NotebookやPyInstallerでも、小工夫すれば同じロジックを流用できる
このテクニックを使うと、スクリプット単位でアウトプットが整理され、後から整理・削除が格段に楽になります。次回は「作成したフォルダ名に日付を付与してバージョン管理する」拡張バージョンを紹介します。
参考資料
