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は不可)




