【Python】osモジュールでファイル・ディレクトリを操作する

Python

こんにちは、かつコーチです。

「ファイルが存在するか確認したい」「フォルダの中身を一覧で取得したい」。
Pythonでファイル操作をしていると、こういう場面によく出会います。

そんなときに使うのがosモジュールです。
osモジュールは、OS(Windows・Mac・Linux)が持つファイルやディレクトリの機能を、Pythonから扱えるようにする標準ライブラリです。

標準ライブラリとは、Pythonをインストールした時点で最初から使える機能のことです。
追加のインストール作業なしで、今すぐ使い始められます。

この記事では、osモジュールの基本的な使い方を、実際に手を動かしながら解説します。
記事を読み終える頃には、ファイル・ディレクトリ操作の基本が身についているはずです。

osモジュールの基本操作

現在の作業ディレクトリを確認する

まずは自分がどこで作業しているのかを確認しましょう。
os.getcwd()を使うと、現在の作業ディレクトリのパスを取得できます。

import os

current_dir = os.getcwd()
print(current_dir)
# 例: /Users/katsu/project

getcwdは「get current working directory」の略です。
スクリプトの実行場所を確認したいときに、最初に使うことが多い関数です。

ディレクトリの中身を一覧表示する

os.listdir()を使うと、指定したディレクトリの中身をリストで取得できます。
引数を省略すると、現在の作業ディレクトリが対象になります。

import os

files = os.listdir(".")
print(files)
# 例: ['main.py', 'data.csv', 'images']

このリストには、ファイルもフォルダも区別なく含まれます。
ファイルとフォルダを分けたい場合は、後述のos.path.isfile()os.path.isdir()と組み合わせます。

パスを安全に結合する

複数のパスを文字列で連結すると、OSによって区切り文字(/\)が違うため、エラーの原因になります。
そこで使うのがos.path.join()です。

import os

base_dir = "data"
file_name = "report.csv"

file_path = os.path.join(base_dir, file_name)
print(file_path)
# Mac/Linux: data/report.csv
# Windows: data\report.csv

os.path.join()を使えば、OSごとの区切り文字の違いをPythonが自動で吸収してくれます。
自分で文字列を+で連結するのは避けましょう。

ファイル・ディレクトリの存在確認

処理を始める前に、対象のファイルが存在するかどうかを確認したい場面はよくあります。
os.path.exists()で確認できます。

import os

file_path = "data/report.csv"

if os.path.exists(file_path):
    print("ファイルが存在します")
else:
    print("ファイルが見つかりません")

さらに細かく、ファイルなのかディレクトリなのかを区別したい場合は、次の2つを使います。

import os

path = "data/report.csv"

print(os.path.isfile(path))  # ファイルならTrue
print(os.path.isdir(path))   # ディレクトリならTrue

ディレクトリの作成

新しいディレクトリを作りたいときはos.makedirs()を使います。
os.mkdir()もありますが、os.makedirs()の方が親ディレクトリごと一括で作れるため実務では便利です。

import os

os.makedirs("output/2026/08", exist_ok=True)

exist_ok=Trueを指定しておくと、すでにディレクトリが存在していてもエラーになりません。
バッチ処理などで繰り返し実行するスクリプトでは、必ずつけておくと安全です。

よくあるつまずきポイント・エラー対処

ディレクトリがすでに存在してエラーになる

Before(つまずいたコード)

import os

os.makedirs("output/2026/08")

このコードを2回実行すると、次のエラーが出ます。

FileExistsError: [Errno 17] File exists: 'output/2026/08'

私も最初、日次バッチのスクリプトでこのエラーに何度もつまずきました。
1回目は成功するのに、2回目の実行で必ず落ちてしまうのです。

原因は単純で、os.makedirs()はデフォルトでは既存のディレクトリを許容しないためです。

After(改善したコード)

import os

os.makedirs("output/2026/08", exist_ok=True)

exist_ok=Trueを追加するだけで、すでにディレクトリがあってもエラーにならず処理が続行されます。
繰り返し実行されるスクリプトでは、この1行を忘れないようにしましょう。

存在しないファイルを開いてエラーになる

Before(つまずいたコード)

with open("data/report.csv") as f:
    content = f.read()

ファイルが存在しない場合、次のエラーが発生します。

FileNotFoundError: [Errno 2] No such file or directory: 'data/report.csv'

After(改善したコード)

import os

file_path = "data/report.csv"

if os.path.exists(file_path):
    with open(file_path) as f:
        content = f.read()
else:
    print(f"{file_path} が見つかりません。処理をスキップします")

ファイルを開く前にos.path.exists()でチェックすることで、予期しない停止を防げます。
特に外部から渡されるファイルパスを扱う処理では、この確認を習慣にすると安心です。

まとめ

この記事のポイント

  • osモジュールはOSのファイル・ディレクトリ機能をPythonから扱える標準ライブラリです
  • os.getcwd()で現在地、os.listdir()で中身の一覧を取得できます
  • os.path.join()でOSに依存しないパス結合ができます
  • os.path.exists()で存在確認をしてから処理すると、エラーを未然に防げます
  • os.makedirs(path, exist_ok=True)で安全にディレクトリを作成できます

次に読むべき記事

より現代的な書き方をしたい方は、pathlibを使ったファイルパス操作の記事もあわせてご覧ください。
CSVファイルを扱う機会が多い方は、csvモジュールの解説記事も参考になります。

タグ: Python, 初心者向け, 標準ライブラリ

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