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()で無限ループを防ぐ

あわせて読みたい

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

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