Python | ファイル操作など:os.remove

Python
スポンサーリンク

概要(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 と同等
Python

pathlib.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 を活用する。この線を守れば、初心者でも削除処理を短く、確実で、実務品質に仕上げられます。

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