🐍 Python

exists() / is_file() / is_dir() で存在と種別を確認する

Pathオブジェクトを作っただけではファイルシステムへのアクセスは発生しません。実際にそのパスが存在するか、ファイルなのかディレクトリなのかを調べるにはexists()・is_file()・is_dir()を使います。

p.exists()   # パスが(ファイルでもディレクトリでも)存在すればTrue
p.is_file()  # 通常のファイルであればTrue
p.is_dir()   # ディレクトリであればTrue
from pathlib import Path

# f1はファイル、d1はディレクトリとして事前に作成済みとする
f1 = Path("a.txt")   # ファイルが存在する場合
d1 = Path("subdir")  # ディレクトリが存在する場合

print(f1.exists())
# True
print(f1.is_file())
# True
print(f1.is_dir())
# False
from pathlib import Path

d1 = Path("subdir")
print(d1.exists())
# True
print(d1.is_dir())
# True
# 存在しないパスはexists()がFalse、is_file()/is_dir()も例外を出さずFalse
from pathlib import Path

ghost = Path("ghost.txt")
print(ghost.exists())
# False
3メソッドの組み合わせ
存在するファイル
exists()=True, is_file()=True, is_dir()=False
存在するディレクトリ
exists()=True, is_file()=False, is_dir()=True
存在しないパス
全てFalse。例外は発生しない
💡 AIコードレビュー観点:存在確認と実際の操作の間に時間差がある

if p.exists(): p.unlink()のように「確認してから操作する」コードは、確認直後に別プロセスがそのファイルを削除するなどして、操作時には既に無くなっている可能性があります(TOCTOU問題)。AIが生成したコードでこのパターンを見つけたら、確認と操作の間に例外(FileNotFoundError等)が起きても壊れない設計になっているか確認しましょう。単発のスクリプトでは問題になりにくいですが、複数プロセス・複数ユーザーが同じファイルを触る環境では注意が必要です。

← Python pathlib クイックリファレンス一覧へ戻る / mkdir/touchでファイルを作る →