Python Path.exists()とは?存在確認をする方法
PythonのPath.exists()は、ファイルやフォルダが存在するかを調べるpathlibのメソッドです。
os.path.exists()と同じ役割ですが、パスオブジェクトからそのまま呼べるのが特徴です。
Path.exists()の基本的な使い方
from pathlib import Path
print(Path("data.csv").exists())
print(Path("nope.csv").exists())
実行結果:
True
False
ファイルでもフォルダでもTrueになります。種類を区別したい場合はis_file()やis_dir()を使います。
from pathlib import Path
p = Path("mydir")
print(p.exists())
print(p.is_file())
print(p.is_dir())
実行結果:
True
False
True
os.path.exists()との違い
| os.path | pathlib | |
|---|---|---|
| 書き方 | os.path.exists(p) |
Path(p).exists() |
| 連結してから確認 | os.path.exists(os.path.join(a, b)) |
(Path(a) / b).exists() |
import os
from pathlib import Path
print(os.path.exists(os.path.join("data", "input.csv")))
print((Path("data") / "input.csv").exists())
実行結果:
True
True
連結と確認を1行でつなげられるのがpathlibの読みやすさです。os.path.join()を書く必要がありません。
os.path.exists()については「Python os.path.exists()とは?存在確認をする方法」をご覧ください。
権限がないとFalseになる
from pathlib import Path
print(Path("/root/secret.txt").exists())
実行結果(一般ユーザーの場合):
False
ファイルが実在していても、確認する権限がなければFalseです。「存在しない」と「見えない」は区別できません。例外も出ません。
「確認してから開く」は避ける
次のコードは一見正しく見えますが、推奨されません。
from pathlib import Path
p = Path("data.csv")
# 推奨されない
if p.exists():
print(p.read_text(encoding="utf-8"))
確認した瞬間と読む瞬間の間に、ファイルが消える可能性があります。他のプログラムが削除すれば、ifを通り抜けたあとで例外が出ます。
推奨:まず開いて、失敗を受け止める
from pathlib import Path
try:
print(Path("data.csv").read_text(encoding="utf-8"))
except FileNotFoundError:
print("ファイルが見つかりません")
except PermissionError:
print("読み取り権限がありません")
すき間がないうえに、権限エラーなど他の失敗も区別して扱えます。
exists()が向いている場面
上書きの確認
from pathlib import Path
out = Path("report.csv")
if out.exists():
if input(f"{out} は既にあります。上書きしますか? [y/N] ") != "y":
raise SystemExit("中止しました")
out.write_text("data", encoding="utf-8")
ユーザーへの確認が目的なので、厳密さより分かりやすさが優先される場面です。
必要なファイルが揃っているか調べる
from pathlib import Path
required = ["config.json", "data/input.csv", "templates/base.html"]
missing = [p for p in required if not Path(p).exists()]
if missing:
print("不足しているファイル:")
for p in missing:
print(" -", p)
else:
print("すべて揃っています")
実行結果(例):
不足しているファイル:
- data/input.csv
起動時のチェックとしてまとめて確認し、まとめて報告する用途に向いています。
シンボリックリンクの扱い
from pathlib import Path
p = Path("broken_link")
print(p.exists())
print(p.is_symlink())
実行結果:
False
True
exists()はリンク先まで追いかけて判定します。リンク自体があっても、リンク先がなければFalseです。
リンクそのものの有無はis_symlink()で調べられます。
存在しないパスでもPathは作れる
from pathlib import Path
p = Path("nope/nothing.txt")
print(p)
print(p.name)
print(p.exists())
実行結果:
nope/nothing.txt
nothing.txt
False
Path()は文字列を組み立てるだけで、ファイルシステムには触りません。名前や拡張子の取得も、実在しないパスで問題なく動きます。
実際にディスクを見るのはexists()やread_text()など、一部のメソッドだけです。
Path.exists()のまとめ
Path.exists()は存在をTrue/Falseで返す- ファイルとフォルダを区別しない。区別には
is_file()/is_dir() (Path(a) / b).exists()のように連結から確認まで1行で書ける- 権限がない場合も
False(例外は出ない) - 「確認してから開く」は避ける。開いて例外を受け止めるほうが安全
- 壊れたシンボリックリンクは
False。リンク自体はis_symlink() Path()自体は実在しなくても作れる




