Python Path.is_dir()とは?ディレクトリか判定する方法
PythonのPath.is_dir()は、パスがフォルダ(ディレクトリ)かどうかを判定するpathlibのメソッドです。
Path.is_dir()の基本的な使い方
from pathlib import Path
print(Path("data").is_dir())
print(Path("data.csv").is_dir())
print(Path("nope").is_dir())
実行結果:
True
False
False
ファイルのときも、存在しないときもFalseです。
フォルダだけを取り出す
from pathlib import Path
dirs = [p for p in Path("projects").iterdir() if p.is_dir()]
for d in dirs:
print(d.name)
実行結果(例):
app
docs
tests
iterdir()はパス付きのオブジェクトを返すため、そのままis_dir()を呼べます。os版のようにjoin()で結合する必要がありません。
サブフォルダを再帰的に探す
from pathlib import Path
for p in sorted(Path("projects").rglob("*")):
if p.is_dir():
print(p)
実行結果(例):
projects/app
projects/app/src
projects/docs
rglob("*")ですべての階層を走査し、フォルダだけを拾っています。
自分で再帰関数を書く必要はありません。rglob()については「Python Path.rglob()とは?サブフォルダも再帰的に検索する方法」をご覧ください。
フォルダを作る前の確認
from pathlib import Path
p = Path("output")
if p.is_dir():
print("既にあります")
elif p.exists():
print("同名のファイルが邪魔しています")
else:
p.mkdir()
print("作成しました")
exists()だけでは「フォルダがある」のか「同名のファイルがある」のか区別できません。
この違いは実際に問題になります。同名のファイルがある場合、mkdir(exist_ok=True)でもFileExistsErrorです。
とはいえ実務では、多くの場合p.mkdir(parents=True, exist_ok=True)を無条件に呼ぶほうが簡潔です。mkdir()については「Python Path.mkdir()とは?フォルダを作成する方法」をご覧ください。
フォルダのサイズを合計する
from pathlib import Path
def dir_size(path):
return sum(p.stat().st_size for p in Path(path).rglob("*") if p.is_file())
for d in Path("projects").iterdir():
if d.is_dir():
print(f"{d.name:12} {dir_size(d):,} バイト")
実行結果(例):
app 12,480 バイト
docs 3,210 バイト
フォルダ自体のサイズは中身の合計ではないため、配下のファイルを数え上げる必要があります。is_file()で絞らないと、フォルダのエントリ分まで加算されてしまいます。
権限とシンボリックリンク
- 権限がない場合も
False(例外は出ない) - リンク先を追いかけて判定する。フォルダへのリンクなら
True
from pathlib import Path
p = Path("link_to_dir")
print(p.is_dir())
print(p.is_symlink())
実行結果:
True
True
再帰的に走査する処理では、リンクをたどって無限ループになることがあります。必要に応じてis_symlink()で除外してください。
from pathlib import Path
for p in Path("projects").rglob("*"):
if p.is_dir() and not p.is_symlink():
print(p)
os.path.isdir()との違い
| os.path | pathlib | |
|---|---|---|
| 判定 | os.path.isdir(p) |
Path(p).is_dir() |
| 一覧から絞る | join()が必要 |
不要 |
| 再帰探索 | os.walk() |
rglob("*") |
動作は同じです。メソッド名の区切りが_になる点だけ違います。
os.path.isdir()については「Python os.path.isdir()とは?ディレクトリか判定する方法」をご覧ください。
Path.is_dir()のまとめ
Path.is_dir()はフォルダのときだけTrue- ファイルも存在しない場合も
False。区別にはexists()を併用 iterdir()との組み合わせでjoin()不要- 再帰的な探索は
rglob("*")との組み合わせが簡潔 - 権限がない場合も
False、リンク先を追いかけて判定する - 再帰処理では
is_symlink()で無限ループを防ぐ



