Pythonのosモジュールでファイルやディレクトリを自在に操ろう!
PythonをコマンドプロンプトやPowerShellでPC上で動かすには、Pythonをダウンロードしてインストールする必要があります。
まだの方はPythonのインストールと開発環境の構築の記事を参考にして、Pythonをインストールしてください。
Webサイトを運営していると、アップロードされた画像を整理したり、定期的にバックアップを取ったりと、サーバー上のファイルを操作したい場面がよくありますよね。そんな時に大活躍するのが、Pythonのosモジュールです。
osモジュールは、PythonでOS(オペレーティングシステム)の機能、特にファイルシステムを操作するための標準ライブラリです。これを使えば、普段マウスやコマンドラインで行っているファイルやディレクトリの作成、削除、名前の変更などをプログラムから自動化できます。
この記事では、Webクリエーターの皆さんが「ちょっとした作業を自動化したいな」と思ったときにすぐ使えるように、osモジュールの基本的な使い方から実践的な応用例まで、コピペでそのまま動くコードをたくさん紹介していきます。難しい理屈は後回し!まずは「動く」楽しさを体験してみましょう!🚀
osモジュールの基本的な使い方
まずは基本の「き」。osモジュールを使うための準備と、よく使われる基本的な機能を見ていきましょう。どんな複雑な操作も、これらの基本の組み合わせでできています。
1. osモジュールのインポート
osモジュールを使うには、まずPythonスクリプトの先頭でインポート(読み込み)する必要があります。これはおまじないのようなものですね。
import os
2. 現在の作業ディレクトリを確認する - getcwd()
プログラムが今どこで実行されているか(カレントワーキングディレクトリ)を知るのは、操作の基本です。os.getcwd() を使って確認できます。(getcwd は get current working directory の略です)
import os
# 現在の作業ディレクトリを取得して表示
current_path = os.getcwd()
print(f"現在のディレクトリ: {current_path}")
# 実行結果例:
# 現在のディレクトリ: /Users/yourname/Documents
3. ディレクトリを作成する - mkdir(), makedirs()
新しいフォルダ(ディレクトリ)を作ってみましょう。os.mkdir() は一つのディレクトリを作成します。深い階層のディレクトリをまとめて作りたい場合は os.makedirs() が便利です。
まずは、mkdir() で一つだけ作成する例です。
import os
# "my_project" という名前のディレクトリを作成
# 実行する前に同じ名前のディレクトリがないことを確認してください
if not os.path.exists("my_project"):
os.mkdir("my_project")
print("my_project ディレクトリを作成しました。")
else:
print("my_project ディレクトリは既に存在します。")
次に、makedirs() で `parent/child` のように、親子関係のあるディレクトリを一度に作成します。`exist_ok=True` を付けておくと、すでにディレクトリが存在していてもエラーにならないので安心です。
import os
# "contents/images" という階層のディレクトリをまとめて作成
# exist_ok=True なので、実行時にディレクトリが既に存在してもエラーにならない
os.makedirs("contents/images", exist_ok=True)
print("contents/images ディレクトリを作成しました(または既に存在します)。")
4. ファイルやディレクトリの一覧を取得する - listdir()
特定のディレクトリの中にどんなファイルやフォルダがあるかを知りたい場合は os.listdir() を使います。引数にパスを指定しない場合、現在の作業ディレクトリの一覧が返されます。
import os
# カレントディレクトリのファイルとディレクトリの一覧を取得
# 事前に "my_project" や "contents" を作成していると、それらが表示されます
items = os.listdir('.') # '.' はカレントディレクトリを指します
print(f"カレントディレクトリの内容: {items}")
# 実行結果例:
# カレントディレクトリの内容: ['my_project', 'contents', 'my_script.py']
5. パスを安全に結合する - path.join()
パスの文字列を自前で "folder" + "/" + "file.txt" のように結合するのは危険です!なぜなら、OSによってパスの区切り文字が違うからです(Windowsは `\`、MacやLinuxは `/`)。os.path.join() を使えば、実行環境のOSに合わせて適切な区切り文字でパスを結合してくれるので、非常に安全です。
import os
# OSに依存しない安全なパスの結合
dir_name = "assets"
file_name = "style.css"
# このコードはWindowsでもMacでもLinuxでも正しく動作します
correct_path = os.path.join(dir_name, "css", file_name)
print(f"生成されたパス: {correct_path}")
# 実行結果例 (Mac/Linux):
# 生成されたパス: assets/css/style.css
# 実行結果例 (Windows):
# 生成されたパス: assets\css\style.css
6. ファイルやディレクトリの名前を変更する / 移動する - rename()
os.rename() は、ファイルやディレクトリの名前を変更するだけでなく、移動にも使えます。移動先に別のディレクトリを指定すれば、そこへ移動させることができます。
import os
# "old_name.txt" というダミーファイルを作成
with open("old_name.txt", "w") as f:
f.write("test")
# "old_name.txt" を "new_name.txt" にリネーム
if os.path.exists("old_name.txt"):
os.rename("old_name.txt", "new_name.txt")
print("old_name.txt を new_name.txt に変更しました。")
# 確認
print(f"現在のディレクトリの内容: {os.listdir('.')}")
7. ファイルやディレクトリを削除する - remove(), rmdir()
ファイルやディレクトリの削除も簡単です。ファイルの削除には os.remove()、空のディレクトリの削除には os.rmdir() を使います。中身が入っているディレクトリは rmdir() では削除できないので注意してください。
import os
# "temp_file.txt" というダミーファイルを作成
with open("temp_file.txt", "w") as f:
f.write("delete me")
# "temp_dir" というダミーディレクトリを作成
if not os.path.exists("temp_dir"):
os.mkdir("temp_dir")
# ファイルを削除
if os.path.exists("temp_file.txt"):
os.remove("temp_file.txt")
print("temp_file.txt を削除しました。")
# 空のディレクトリを削除
if os.path.exists("temp_dir"):
os.rmdir("temp_dir")
print("temp_dir を削除しました。")
【実践】osモジュールを使ってみよう!
基本がわかったところで、次はより実践的なコードを見ていきましょう。これらの例は、あなたの日常業務を少し楽にしてくれるかもしれません。
応用例1: 複数の画像ファイルを拡張子ごとに整理する
ダウンロードフォルダや素材フォルダに、JPGやPNG、SVGといった画像ファイルがごちゃ混ぜになっていませんか? これらを拡張子ごとのフォルダに自動で振り分けるスクリプトです。
import os
# --- 準備:整理対象のダミーファイルを作成 ---
# "image_sorter" という作業ディレクトリを作成
base_dir = "image_sorter"
os.makedirs(base_dir, exist_ok=True)
# ダミーの画像ファイルを作成
dummy_files = ["cat.jpg", "dog.png", "logo.svg", "photo.jpg", "icon.png"]
for fname in dummy_files:
# os.path.joinを使って安全にパスを生成
with open(os.path.join(base_dir, fname), "w") as f:
f.write(f"This is {fname}.")
print(f"整理前の {base_dir} の中身: {os.listdir(base_dir)}")
print("-" * 20)
# --- ここまで準備 ---
# --- メインの処理:ファイルを整理する ---
# 整理対象のディレクトリを指定
target_dir = "image_sorter"
# ディレクトリ内の全ファイルを取得
for filename in os.listdir(target_dir):
# ファイルのフルパスを生成
full_path = os.path.join(target_dir, filename)
# それがファイルでなければ(=ディレクトリなら)スキップ
if not os.path.isfile(full_path):
continue
# ファイル名から拡張子を取得 (例: ".jpg")
# os.path.splitext はファイル名と拡張子を分割してくれる便利な関数
ext = os.path.splitext(filename)[1] # ("cat", ".jpg") の2番目を取得
# 拡張子がないファイルはスキップ
if not ext:
continue
# 拡張子の "." を除いた名前でフォルダを作成 (例: "jpg" フォルダ)
# 拡張子は小文字に統一
folder_name = ext[1:].lower()
ext_dir = os.path.join(target_dir, folder_name)
# フォルダがなければ作成
os.makedirs(ext_dir, exist_ok=True)
# ファイルを新しいフォルダに移動
new_path = os.path.join(ext_dir, filename)
os.rename(full_path, new_path)
print(f"{filename} を {folder_name} フォルダに移動しました。")
print("-" * 20)
print(f"整理後の {base_dir} の中身: {os.listdir(base_dir)}")
print(f"jpgフォルダの中身: {os.listdir(os.path.join(base_dir, 'jpg'))}")
print(f"pngフォルダの中身: {os.listdir(os.path.join(base_dir, 'png'))}")
【完全コピペOK】デスクトップにテスト環境を自動生成するコード
ここまで読んで、「自分のPCで試したいけど、どこで実行すればいいの?」と思った方もいるかもしれません。そこで、これをコピペして `create_test_env.py` のような名前で保存し、実行するだけで、あなたのPCのデスクトップにテスト用のフォルダとファイルを自動生成する「まるっと動く」Pythonコードを用意しました。実行後にデスクトップを確認してみてください!
(※このコードはデスクトップに `python_os_test` というフォルダを作成します。不要になったらフォルダごと削除してください)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Python osモジュール コード例</title>
<style>
body { background-color: #202124; color: #e8eaed; font-family: sans-serif; }
pre { background-color: #282c34; color: #abb2bf; padding: 1em; border-radius: 5px; overflow-x: auto; }
code { font-family: 'Courier New', Courier, monospace; }
h1 { color: #669df6; }
p { line-height: 1.6; }
</style>
</head>
<body>
<h1>Pythonコード: デスクトップにテスト環境を自動生成</h1>
<p>以下のPythonコードをコピーして、`create_test_env.py` という名前で保存し、ターミナルやコマンドプロンプトから `python create_test_env.py` を実行してください。</p>
<pre><code>
import os
import sys
def create_test_environment():
"""
デスクトップにテスト用のディレクトリとファイルを生成する関数
"""
try:
# 1. デスクトップのパスを取得
# os.path.expanduser('~') はホームディレクトリを取得する
desktop_path = os.path.join(os.path.expanduser('~'), 'Desktop')
# デスクトップが存在しないOS環境(CUIサーバーなど)の場合はカレントディレクトリを使う
if not os.path.exists(desktop_path):
desktop_path = os.getcwd()
print(f"デスクトップが見つかりません。カレントディレクトリに作成します: {desktop_path}")
# 2. メインのテストフォルダを作成
main_test_dir = os.path.join(desktop_path, "python_os_test")
os.makedirs(main_test_dir, exist_ok=True)
print(f"メインフォルダを作成しました: {main_test_dir}")
# 3. サブフォルダを作成
sub_dirs = ["documents", "images", "archives"]
for sub_dir in sub_dirs:
os.makedirs(os.path.join(main_test_dir, sub_dir), exist_ok=True)
print(f"サブフォルダを作成しました: {sub_dirs}")
# 4. ダミーファイルを作成
files_to_create = {
"documents": ["report.txt", "memo.md"],
"images": ["cat.jpg", "dog.png"],
"": ["readme.txt"] # メインフォルダ直下
}
for directory, filenames in files_to_create.items():
for filename in filenames:
file_path = os.path.join(main_test_dir, directory, filename)
with open(file_path, "w", encoding="utf-8") as f:
f.write(f"これは {filename} のテストコンテンツです。")
print("ダミーファイルを作成しました。")
print("\n")
print("🎉 セットアップ完了!")
print(f"{main_test_dir} を確認してみてください。")
except OSError as e:
print(f"エラーが発生しました: {e}", file=sys.stderr)
print("権限の問題か、パスに問題がある可能性があります。", file=sys.stderr)
except Exception as e:
print(f"予期せぬエラーが発生しました: {e}", file=sys.stderr)
if __name__ == "__main__":
create_test_environment()
</code></pre>
</body>
</html>
気をつけるべき3つのポイント
osモジュールは強力ですが、直接ファイルシステムを操作するため、いくつか注意すべき点があります。これらを知っておくだけで、多くのエラーを防ぐことができます。
- パスの指定ミス
「そんなファイル/ディレクトリはありません」というエラー(FileNotFoundError)のほとんどは、パスの指定ミスが原因です。os.getcwd()で現在の位置を確認したり、os.path.exists()で操作対象の存在を事前にチェックしたりする習慣をつけましょう。 - エラー処理を怠らない
既に存在するディレクトリをos.mkdir()で作ろうとしたり、存在しないファイルをos.remove()で消そうとするとエラーでプログラムが止まってしまいます。os.path.exists()での事前チェックや、try...except構文を使って、エラーが起きても大丈夫なように処理を書いておくと、より安定したプログラムになります。 - 取り返しのつかない操作
os.remove()やos.rename()といった操作は、基本的に「元に戻す」ことができません。PCのゴミ箱機能も経由しません。特に重要なファイルを扱う場合は、いきなり削除するのではなく、一度別のバックアップ用フォルダに移動するなどのワンクッションを置くのが安全です。
もっと便利に!関連モジュールの紹介
osモジュールは基本ですが、よりモダンで便利なライブラリも存在します。ステップアップとして、これらのライブラリも知っておくと良いでしょう。
pathlib - モダンで直感的なパス操作
pathlib は、Python 3.4から標準ライブラリに追加された、パスをオブジェクトとして直感的に扱えるモジュールです。文字列ではなくオブジェクトなので、メソッドチェーンで処理を書けたり、/ 演算子でパスを結合できたりと、コードがスッキリします。
from pathlib import Path
# カレントディレクトリをPathオブジェクトとして取得
p = Path('.')
# pathlibを使ったディレクトリ作成
new_dir = p / "pathlib_test" # / 演算子でパスを結合できる!
new_dir.mkdir(exist_ok=True) # メソッドとして実行
# ファイルの一覧も簡単
for item in p.iterdir():
print(f"{'ディレクトリ' if item.is_dir() else 'ファイル'}: {item.name}")
shutil - 高水準なファイル操作
shutil(シェイプユーティリティ)は、osモジュールよりも高水準なファイル操作を提供します。例えば、osモジュールでは自力で再帰的に処理を書く必要があった「中身の入ったディレクトリのコピーや削除」も、shutilなら一行で完了します。
import shutil
import os
# --- 準備 ---
os.makedirs("source_dir/sub_dir", exist_ok=True)
with open("source_dir/sub_dir/data.txt", "w") as f:
f.write("important data")
# --- shutilの利用例 ---
# ディレクトリを丸ごとコピー
if os.path.exists("source_dir"):
shutil.copytree("source_dir", "backup_dir")
print("source_dir を backup_dir にコピーしました。")
# 中身ごとディレクトリを削除
if os.path.exists("backup_dir"):
shutil.rmtree("backup_dir")
print("backup_dir を中身ごと削除しました。")
# 不要になったsource_dirも削除
shutil.rmtree("source_dir")
まとめ
今回は、Pythonのosモジュールを使ったファイル・ディレクトリ操作について、基本的な使い方から応用例までご紹介しました。Webサイト制作の裏側では、このような地道なファイル操作が数多く発生します。osモジュールを使いこなせれば、面倒な手作業を自動化し、クリエイティブな仕事にもっと集中できるようになるはずです。
まずはこの記事のコードをコピペして動かしてみて、「プログラムでファイルが動く!」という感覚を掴んでみてください。そこから、あなたの業務に合わせたカスタマイズに挑戦してみましょう!
次のステップへ
ファイル操作の次は、数値計算の世界を探検してみませんか?Pythonのmathモジュールを使えば、三角関数や対数など、様々な数学的計算を簡単に行うことができます。
➡️ mathモジュールで数学関数を使いこなす