ファイル操作を行うスクリプトでは、「指定したフォルダの中にある全てのファイルを処理したい」という場面が頻繁に発生します。
Pythonでディレクトリ直下のコンテンツ一覧を取得するには、主に2つの方法があります。
pathlibモジュール(推奨): Python 3.4以降で導入された、オブジェクト指向のモダンな方法。osモジュール: 古くから使われている、基本的な関数群。
この記事では、これら2つの方法の使い方と、ファイルとディレクトリを区別する応用テクニックについて解説します。
1. pathlib モジュールを使用する方法(推奨)
現在、Pythonでファイルパスを扱う際の標準(デファクトスタンダード)となっているのが pathlib モジュールです。 パスをオブジェクトとして扱い、直感的で読みやすいコードを書くことができます。
iterdir() メソッド
ディレクトリの中身を取得するには、Path オブジェクトの iterdir() メソッドを使用します。これはイテレータを返すため、for ループで回したり、list() でリストに変換したりして使用します。
from pathlib import Path
# 対象のディレクトリパス(カレントディレクトリ "." を指定)
target_dir = Path(".")
print(f"--- '{target_dir.resolve()}' の内容 ---")
# iterdir() で中身を走査
for item in target_dir.iterdir():
print(item.name)
実行結果(例):
--- /Users/username/projects/myapp の内容 ---
main.py
requirements.txt
assets
README.md
リストとして取得する
中身をリストとして保持したい場合は、リスト内包表記を使うと簡潔です。
# パスオブジェクトのリストを作成
file_list = [p for p in target_dir.iterdir()]
# ファイル名(文字列)だけのリストを作成
filename_list = [p.name for p in target_dir.iterdir()]
print(filename_list)
実行結果(例):
['main.py', 'requirements.txt', 'assets', 'README.md']
2. os.listdir() を使用する方法(従来の方法)
古くから使われている os モジュールの os.listdir() 関数を使用すると、ディレクトリ内のエントリ名を文字列のリストとして取得できます。
import os
# 対象のディレクトリパス
target_path = "data_folder"
# ディレクトリが存在するか確認してから実行
if os.path.exists(target_path):
# ファイル名・ディレクトリ名のリストを取得
items = os.listdir(target_path)
print(items)
else:
print(f"ディレクトリ '{target_path}' が見つかりません。")
実行結果(例):
['data_01.csv', 'data_02.csv', 'archive']
シンプルですが、返り値が単なる「文字列」であるため、パスの結合や属性の確認を行うには、別途 os.path 系の関数を使う必要があります。そのため、近年では pathlib の使用が推奨される傾向にあります。
応用:ファイルとディレクトリを区別する
取得した一覧の中に、ファイルとディレクトリ(フォルダ)が混在している場合があります。これらを区別して処理したい場合、pathlib を使うと非常にスムーズに記述できます。
from pathlib import Path
# 調査対象のディレクトリ
base_path = Path("project_root")
print("=== ファイル一覧 ===")
# is_file() で判定
files = [p.name for p in base_path.iterdir() if p.is_file()]
print(files)
print("\n=== ディレクトリ一覧 ===")
# is_dir() で判定
directories = [p.name for p in base_path.iterdir() if p.is_dir()]
print(directories)
実行結果(例):
=== ファイル一覧 ===
['config.json', 'script.py']
=== ディレクトリ一覧 ===
['logs', 'templates', 'static']
まとめ
pathlib.Path(パス).iterdir(): 推奨される方法。パスをオブジェクトとして扱え、ファイル判定(is_file)などが容易です。os.listdir(パス): 従来の方法。ファイル名の文字列リストが返されます。
特別な理由がない限り、可読性と機能性に優れた pathlib を使用することをお勧めします。
