HOWTO · Python

Python にファイルが存在するかどうかを確認する方法

このハウツー記事では、ファイルが Python に存在するかどうかを確認する方法を紹介します

このページの内容

パスがディレクトリではなくファイルを指している必要がある場合は、正規ファイルかどうかを確認すると便利です。pathlib のパスには Path.is_file() を使います。結果は真偽値で、正規ファイルを指すシンボリックリンクもたどります。ただし、確認結果はその時点の状態にすぎません。後続の処理までにパスが変わることもあるため、ファイルを使う段階で直接開いてください。

パスがファイルかどうかを確認する

プログラムが作成した正規ファイルを確認するには、次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "notes.txt"
    path.write_text("Hello, Python!", encoding="utf-8")
    print(path.is_file())

一時ディレクトリを使うことで、例を単独で実行できるようにしています。パスが正規ファイルを指しているかを確認するなら、Path.is_file() が最も明快な選択肢です。正規ファイルなら True になり、パスが存在しない場合、ディレクトリを指す場合、または正規ファイルだと確認できない場合は False になります。

pathlib.Path.is_file() を使う

pathlib はファイルシステムのパスを Path オブジェクトとして扱うため、すでに pathlib を使っているコードに適しています。文字列からパスを作成するか、ディレクトリのパスとファイル名を / で結合してから、is_file() を呼び出します。

このセクションのコードと表示されるラベルや出力は英語のままです。

from pathlib import Path

path = Path("reports") / "summary.txt"
if path.is_file():
    print("A regular file is available.")

この例では、読者の環境に reports/summary.txt が存在するとは仮定せずに確認方法を示しています。ファイルを開いたり読み込んだりはしません。ファイルシステムのアクセス権限やOSのエラーによって、確認できる内容が変わることがあります。そのため、結果が False でも、アクセスできなかった理由の診断には使わないでください。

os.path.isfile() を使う

os.path を使うコードでは、パスを引数にして isfile() 関数を呼び出します。これは Path.is_file() と同じく、正規ファイルかどうかを確認する方法です。

このセクションのコードと表示されるラベルや出力は英語のままです。

import os

path = os.path.join("reports", "summary.txt")
if os.path.isfile(path):
    print("A regular file is available.")

os.path.isfile() は関数で、Path.is_file() は Path オブジェクトのメソッドです。周囲のコードに合う方を選んでください。どちらも正規ファイルとディレクトリを区別します。

ディレクトリも対象にする場合は exists() を使う

パスがファイルかディレクトリかにかかわらず、存在するかどうかだけを知りたい場合は、Path.exists() または os.path.exists() を使います。どちらもディレクトリに対して True を返すことがあるため、正規ファイルだけを確認する方法より対象が広くなります。たとえば、その場所にファイルまたはディレクトリのどちらがあってもよい場合は Path("reports").exists() を使い、正規ファイルだけを対象にする場合は Path("reports").is_file() を使います。

これらの確認だけでは、その後の読み込みや書き込みが成功するとは限りません。確認後にパスが変わる可能性があり、存在することはプロセスに使用権限があることを意味しません。実際の操作が目的なら、その操作を実行し、該当するエラーを処理してください。

ファイルを使うときは直接開く

次に読み込むのであれば、直接開くことで、古くなっているかもしれない確認結果に頼らずに済みます。パスが存在しない場合に処理したいときだけ FileNotFoundError を捕捉してください。権限やその他の入出力エラーはそのまま表面化させるか、アプリケーションの要件に応じて個別に処理します。

このセクションのコードと表示されるラベルや出力は英語のままです。

from pathlib import Path

path = Path("settings.json")
try:
    with path.open(encoding="utf-8") as file:
        contents = file.read()
except FileNotFoundError:
    contents = None

if contents is None:
    print("The settings file is missing.")
else:
    print("The settings file was read.")

この方法では、目的の読み込みを試みながら、ファイルがない場合だけを個別に処理します。PermissionError やその他の OSError を、パスが存在しない証拠として扱うことはありません。パスの種類を報告したり、それに応じて処理を分けたりする必要がある場合は先に確認し、今すぐファイルを読み込む場合は直接開いてください。