Python Path.unlink()とは?ファイルを削除する方法

PythonのPath.unlink()は、ファイルを削除するpathlibのメソッドです。

名前はdeleteではなくunlinkです。UNIX系のシステムコール名に由来しています。


Path.unlink()の基本的な使い方

from pathlib import Path

Path("temp.txt").unlink()
print(Path("temp.txt").exists())

実行結果:

False

戻り値はありません。削除できなければ例外が出ます。

ゴミ箱には入らず、その場で完全に消えます。


missing_ok=Trueで「なくても無視」

from pathlib import Path

Path("nope.txt").unlink()

実行結果:

FileNotFoundError: [Errno 2] No such file or directory: 'nope.txt'

missing_ok=Trueを付けると、存在しなくてもエラーになりません(Python 3.8以降)。

from pathlib import Path

Path("nope.txt").unlink(missing_ok=True)
print("エラーになりません")

実行結果:

エラーになりません

これはos.remove()にはない引数です。「あれば消す」という処理が1行で書けます。

import os
import contextlib
from pathlib import Path

# os: 例外を抑える書き方が必要
with contextlib.suppress(FileNotFoundError):
    os.remove("temp.txt")

# pathlib: 引数ひとつ
Path("temp.txt").unlink(missing_ok=True)

一時ファイルの後片付けなど、存在が不確かなファイルを消す場面で重宝します。


フォルダは削除できない

from pathlib import Path

Path("mydir").unlink()

実行結果(macOS):

PermissionError: [Errno 1] Operation not permitted: 'mydir'

LinuxではIsADirectoryErrorになります。OSによってエラーの種類が変わるため、エラー名で判定するのは避けてください。

消したいもの 使うもの
ファイル Path.unlink()
空のフォルダ Path.rmdir()
フォルダと中身すべて shutil.rmtree()
import shutil
from pathlib import Path

Path("empty_dir").rmdir()          # 空のときだけ
shutil.rmtree(Path("data"))        # 中身ごと

pathlibには「中身ごと削除」のメソッドがありません。shutil.rmtree()にPathオブジェクトをそのまま渡します。


まとめて削除する

from pathlib import Path

count = 0
for p in Path("cache").glob("*.tmp"):
    if p.is_file():
        p.unlink()
        count += 1

print(f"{count}件を削除しました")

実行結果(例):

3件を削除しました

is_file()で絞るのが重要です。glob("*.tmp")は同名のフォルダも拾うため、そのままunlink()するとエラーになります。

失敗しても続ける

from pathlib import Path

for p in Path("cache").glob("*.tmp"):
    try:
        p.unlink()
    except OSError as e:
        print(f"削除失敗: {p} ({e})")

OSErrorでまとめて捕捉します。FileNotFoundErrorもPermissionErrorもOSErrorのサブクラスなので、1つのexceptで受け止められます。

1件失敗しても残りの処理を続けられる点が重要です。


削除前に必ず対象を確認する

ゴミ箱を経由しないため、パターンの指定ミスが致命傷になります。

from pathlib import Path

targets = sorted(p for p in Path("logs").glob("*.tmp") if p.is_file())

print(f"{len(targets)}件を削除します:")
for t in targets:
    print(" -", t)

if input("よろしいですか? [y/N] ") == "y":
    for t in targets:
        t.unlink()

ワイルドカードを使う削除では、必ず対象を先に表示してください。

特にrglob()との組み合わせは危険です。サブフォルダの奥まで一致してしまうため、意図しないファイルを消す事故が起きやすくなります。

ゴミ箱に入れたい場合

import send2trash

send2trash.send2trash("temp.txt")

send2trashという外部ライブラリを使うと、OSのゴミ箱に移動できます。ユーザーのファイルを扱うツールでは検討する価値があります。

pip install send2trash

開いているファイルの扱い

OS 使用中ファイルの削除
macOS / Linux 削除できる
Windows PermissionError

Windowsでは、開いたままのファイルを削除しようとするとエラーになります。with文で確実に閉じてから削除してください。

from pathlib import Path

p = Path("temp.txt")
p.write_text("data", encoding="utf-8")   # 自動的に閉じられる
p.unlink()

write_text()やread_text()は内部でファイルを閉じてくれるため、この問題は起きません。


Path.unlink()のまとめ

  • Path.unlink()はファイルを削除する(ゴミ箱に入らない)
  • missing_ok=Trueで存在しなくてもエラーにしない(3.8以降)
  • フォルダは削除できない。空ならrmdir()、中身ごとならshutil.rmtree()
  • 一括削除ではis_file()で絞り、OSErrorで捕捉して継続する
  • ワイルドカード削除は必ず対象を確認してから実行する
  • 使用中ファイルの削除可否はOSによって違う(Windowsは不可)

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら