Python ディレクトリ配下のファイルの一覧を再帰的に取得する

ディレクトリ直下のファイル一覧、ディレクトリ一覧を3つの方法で取得します。

ディレクトリは以下、ファイルはtxtとlogの2種類です。

ディレクトリ、ファイル構成

sample_dir
  │  
  │  f_01.txt
  │  f_02.log
  │
  ├─d_01
  │      f_01_1.txt
  │      f_01_2.txt
  │      f_01_3.txt
  │
  └─d_02
          f_02_1.log


pathlibで ディレクトリ配下のファイル一覧を取得する

pathlib.Pathを利用して、 拡張子を指定したファイル一覧およびディレクトリとファイル一覧を表示する サンプルコード です。

import pathlib

p = pathlib.Path("sample_dir")

# ディレクトリ配下のテキストファイル一覧を表示(拡張子指定)
for f in p.glob("**/*.txt"):
    print(f)

print()

# ディレクトリ配下のディレクトリ、ファイル一覧を表示
for f in p.glob("**/*"):
    print(f)


# - 結果1
# sample_dir\f_01.txt
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt

# - 結果2
# sample_dir\d_01
# sample_dir\d_02
# sample_dir\f_01.txt
# sample_dir\f_02.log
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt
# sample_dir\d_02\f_02_1.log

pathlib.Path関数にディレクトリのパスを指定します。glob関数で取得するサンプルは相対パスですが、絶対パスも指定可能です。

pathlibの詳細については、公式ドキュメントを参照ください。


globでディレクトリ配下のファイル一覧を取得する

globを利用して、拡張子を指定したファイル一覧およびディレクトリとファイル一覧を表示する サンプルコード です。

import glob

TARGET_DIR = "sample_dir"

# ディレクトリ配下のテキストファイル一覧を表示(拡張子指定)
for f in glob.glob(TARGET_DIR + "/**/*.txt", recursive=True):
    print(f)

print()

# ディレクトリ配下のディレクトリ、ファイル一覧を表示
for f in glob.glob(TARGET_DIR + "/**", recursive=True):
    print(f)


# - 結果1
# sample_dir\f_01.txt
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt

# - 結果2
# sample_dir\
# sample_dir\d_01
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt
# sample_dir\d_02
# sample_dir\d_02\f_02_1.log
# sample_dir\f_01.txt
# sample_dir\f_02.log

glob.glob関数にパスを指定します、再帰的に検索する行うには、「recursive」に「True」を指定します。

globの詳細については、公式ドキュメントを参照ください。


walkでディレクトリ配下のファイル一覧を取得する

os.walkを利用して、拡張子を指定したファイル一覧およびディレクトリとファイル一覧を表示する サンプルコード です。


import os

TARGET_DIR = "sample_dir"

# ディレクトリ配下のテキストファイル一覧を表示
for dir_path, dir_names, file_names in os.walk(TARGET_DIR):
    for file_name in file_names:
        if ".txt" in file_name:
            print(os.path.join(dir_path, file_name))

print()

# ディレクトリ配下のディレクトリ、ファイル一覧を表示
for dir_path, dir_names, file_names in os.walk(TARGET_DIR):
    for dir_name in dir_names:
        print(os.path.join(dir_path, dir_name))
    for file_name in file_names:
        f = os.path.join(dir_path, file_name)
        print(f)


# - 結果1
# sample_dir\f_01.txt
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt

# - 結果2
# sample_dir\d_01
# sample_dir\d_02
# sample_dir\f_01.txt
# sample_dir\f_02.log
# sample_dir\d_01\f_01_1.txt
# sample_dir\d_01\f_01_2.txt
# sample_dir\d_01\f_01_3.txt
# sample_dir\d_02\f_02_1.log


os.walk関数にパスを指定します。これまでと違うのは、os.walkでは、ディレクトリパス、ディレクトリ名、ファイル名の3つの戻り値が返却されます。

os.walkの詳細については、公式ドキュメントを参照ください。