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()自体は実在しなくても作れる

あわせて読みたい

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

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