概要(os.remove は「ファイルを1つ削除する」ための基本関数)
os.remove は、指定したパスの“ファイル”を削除する関数です。直感的ですが、重要なのは「削除対象はファイルのみ(ディレクトリは不可)」「存在しないパスや権限不足で例外が出る」「安全に扱うには try/except で包む」ことです。相対パス/絶対パスを正しく使い分け、実務では pathlib.Path.unlink も併用すると読みやすくなります。
import os
os.remove("old_report.txt") # 成功すれば何も返さずファイルが消える
Python基本の使い方(ここが重要)
単純削除(相対パス・絶対パス)
import os
# 相対パス(現在の作業ディレクトリ配下)
os.remove("logs/app.log")
# 絶対パス(OSごとの完全パス)
# os.remove(r"C:\work\project\logs\app.log") # Windows
# os.remove("/home/user/project/logs/app.log") # UNIX系
Python例外で終了判定(存在しない・権限なし)
「無ければエラー」「権限が無ければエラー」です。チェックしてから削除するより、try/except で“意図どおりの終了”を設計する方が安全です(存在確認→削除の間に外部が変更する競合を避けられる)。
import os
def remove_safe(path: str) -> bool:
try:
os.remove(path)
return True
except FileNotFoundError:
return False # 既に無い → 目的(無くす)は達成
except PermissionError:
return False # 権限不足(読み取り専用・ロックなど)
Python重要な挙動の深掘り(ファイル限定・エラーと競合)
ファイル限定(ディレクトリは rmdir/rmtree)
os.remove はファイル専用です。ディレクトリを消したいなら os.rmdir(空フォルダのみ)か shutil.rmtree(中身ごと再帰削除)を使います。
import os, shutil
# 空フォルダだけ
os.rmdir("empty_dir")
# 中身ごと
shutil.rmtree("dir_with_files")
Python“存在確認してから削除”の落とし穴(TOCTOU)
os.path.exists → os.remove の間に、他プロセスがファイルを動かす可能性があります。存在確認は参考程度にし、最終判断は os.remove の例外で行うのが堅実です。
# 例外ベースで設計する方がレースに強い
try:
os.remove("target.txt")
except FileNotFoundError:
pass
Python権限・ロック・使用中の扱い
権限が無い場所や、別プロセスが使用中のファイルは削除に失敗します(PermissionError など)。ユーザー向けツールでは「閉じてから再試行」や「ログしてスキップ」を選べる設計が現実的です。
道具の使い分け(remove・unlink・pathlib・trash)
os.remove と os.unlink(同じ動作)
os.unlink は remove の別名です。歴史的な名前の違いだけで、動作は同じ“ファイル削除”です。
import os
os.unlink("old.log") # os.remove と同等
Pythonpathlib.Path.unlink(読みやすい現代的スタイル)
Path でパスを扱うなら、unlink が自然です。missing_ok=True で“無ければスキップ”が一行で書けます(Python 3.8+)。
from pathlib import Path
p = Path("output/result.txt")
p.unlink(missing_ok=True)
Python“ゴミ箱へ移動”は標準では非対応
標準ライブラリの削除は“完全削除”です。復元可能な削除(ゴミ箱)は別途ライブラリが必要になります。重要ファイルは“バックアップ→検証→削除”の順で安全側に設計しましょう。
実務の定番タスク(例題で身につける)
例題1:拡張子で一括削除(.log を全削除)
import os
def remove_logs(root: str) -> int:
count = 0
for name in os.listdir(root):
path = os.path.join(root, name)
if os.path.isfile(path) and name.lower().endswith(".log"):
try:
os.remove(path)
count += 1
except PermissionError:
print("権限不足:", path)
return count
print(remove_logs("logs"))
Python例題2:日付が古いファイルだけ削除(更新時刻基準)
import os, time
def purge_old(root: str, days: int = 7) -> int:
cutoff = time.time() - days * 24 * 60 * 60
removed = 0
for name in os.listdir(root):
path = os.path.join(root, name)
if os.path.isfile(path) and os.path.getmtime(path) < cutoff:
try:
os.remove(path)
removed += 1
except Exception as e:
print("WARN", e, path)
return removed
print(purge_old("downloads", 30))
Python例題3:pathlib で安全に一括削除(missing_ok)
from pathlib import Path
def clean_tmp(root: str) -> None:
for p in Path(root).glob("*.tmp"):
p.unlink(missing_ok=True)
clean_tmp("build")
Python例題4:CSV を処理後、成果物以外を掃除
import os, csv
def process_and_cleanup(root: str) -> None:
totals = {}
for name in os.listdir(root):
path = os.path.join(root, name)
if os.path.isfile(path) and name.endswith(".csv"):
with open(path, "r", encoding="utf-8", newline="") as f:
total = sum(int(row[1]) for row in csv.reader(f))
totals[name] = total
# 集計を保存
with open(os.path.join(root, "summary.txt"), "w", encoding="utf-8") as f:
for k, v in sorted(totals.items()):
f.write(f"{k}: {v}\n")
# 原本を削除(結果が出てから)
for name in totals:
try:
os.remove(os.path.join(root, name))
except Exception as e:
print("WARN", e, name)
Pythonまとめ
os.remove は“ファイル1つを即削除”するための基本関数です。ディレクトリは対象外で、空なら os.rmdir、内容ごとなら shutil.rmtree。レースや外部要因を踏まえ、存在確認より例外ベースの安全設計を優先し、権限・ロックで失敗しうる前提でコードを書く。読みやすさと堅牢性を高めるなら pathlib.Path.unlink と missing_ok を活用する。この線を守れば、初心者でも削除処理を短く、確実で、実務品質に仕上げられます。
