概要(os.listdir は「フォルダの中身の名前一覧」を取得する基本関数)
os.listdir は、指定したディレクトリに存在する「ファイル名やサブディレクトリ名」をまとめてリストで返します。中身の“名前”だけを返すため、フルパスが必要なら結合(os.path.join)を使います。非再帰(直下のみ)で、順序は保証されないので必要ならソートしましょう。
import os
print(os.listdir(".")) # カレントディレクトリ直下の名前一覧
print(os.listdir("data")) # data フォルダ直下の名前一覧
Python基本の使い方(ここが重要)
ディレクトリを指定して一覧を取得する
引数にパス文字列を渡します。省略すると「現在の作業ディレクトリ(カレント)」が対象です。結果は文字列のリストなので、そのまま表示や繰り返し処理に使えます。
import os
names = os.listdir("logs")
for name in names:
print(name)
Pythonフルパスが必要なら os.path.join で結合する
listdir が返すのは“名前”であって“パス”ではありません。後続で開いたり、サイズや種別を調べるなら、必ずディレクトリと結合したフルパスを作ってから扱います。
import os
root = "data"
for name in os.listdir(root):
path = os.path.join(root, name)
print(path) # data/name というフルパス
Pythonファイルかディレクトリかの判定(重要ポイントの深掘り)
種別判定は os.path.isfile / os.path.isdir を使う
名前一覧から「ファイルだけ」「ディレクトリだけ」を絞り込みたいときは、結合したフルパスに対して isfile / isdir を使います。これで安全にフィルタできます。
import os
root = "data"
files = []
dirs = []
for name in os.listdir(root):
path = os.path.join(root, name)
if os.path.isfile(path):
files.append(name)
elif os.path.isdir(path):
dirs.append(name)
print("files:", files)
print("dirs:", dirs)
Python特定の拡張子だけを取り出す
拡張子判定には os.path.splitext(拡張子取り出し)や文字列の endswith を使います。必ずフルパスで isfile を通してから扱うと誤判定が減ります。
import os
root = "data"
csvs = []
for name in os.listdir(root):
path = os.path.join(root, name)
if os.path.isfile(path) and name.lower().endswith(".csv"):
csvs.append(path)
print(csvs)
Python並び順・非再帰・大規模時の注意
結果の順序は不定なので必要ならソートする
os.listdir の返す並びは保証されません。ユーザーに見せる、再現性が必要、といった場面では sorted(names) でソートしてから扱います。大小文字をそろえてからソートすると安定します。
import os
names = os.listdir("data")
for name in sorted(names, key=str.casefold):
print(name)
Python直下しか見ない(非再帰)。再帰なら os.walk や pathlib を使う
サブディレクトリの中までは自動で辿りません。全階層を対象にしたいときは os.walk(再帰的に辿るジェネレータ)や pathlib.Path.rglob を使うのが定石です。
import os
for root, dirs, files in os.walk("data"):
for filename in files:
print(os.path.join(root, filename))
Python大量に項目がある場合は os.scandir が高速
メタデータ(種別や stat)を同時に取得したい、件数が非常に多い、といったケースでは os.scandir が効率的です。初心者はまず listdir で十分ですが、速度が気になったら切り替えを検討しましょう。
import os
with os.scandir("data") as it:
for entry in it:
if entry.is_file():
print(entry.name, entry.stat().st_size) # サイズも取得
Python例外と安全策(存在・権限・日本語名)
FileNotFoundError / PermissionError への備え
存在しないパスや権限のないフォルダに対しては例外が発生します。必要なら try/except を添えて、ユーザー向けに分かりやすく扱いましょう。
import os
def list_safe(path: str) -> list[str]:
try:
return os.listdir(path)
except FileNotFoundError:
return []
except PermissionError:
return []
Python日本語・スペースを含むパスの扱い
Python は Unicode に強いので、日本語名でも基本は問題ありません。文字列リテラルはそのまま扱えますが、結合や表示の前にフルパスを作り、存在確認(os.path.exists)を習慣化すると安心です。
import os
path = "レポート 集計"
print(os.path.exists(path))
Python実務の定番タスク(例題で身につける)
例題1:CSV ファイルを列挙して合計を計算
import os, csv
def total_qty(root: str) -> int:
total = 0
for name in os.listdir(root):
path = os.path.join(root, name)
if os.path.isfile(path) and name.lower().endswith(".csv"):
with open(path, "r", encoding="utf-8", newline="") as f:
for row in csv.reader(f):
total += int(row[1])
return total
print(total_qty("data"))
Python例題2:拡張子ごとにフォルダへ振り分ける
import os, shutil
def sort_by_ext(src: str) -> None:
for name in os.listdir(src):
path = os.path.join(src, name)
if os.path.isfile(path):
ext = os.path.splitext(name)[1].lstrip(".").lower() or "_none"
dest_dir = os.path.join(src, ext)
os.makedirs(dest_dir, exist_ok=True)
shutil.move(path, os.path.join(dest_dir, name))
sort_by_ext("downloads")
Python例題3:更新日時で並べ替えて最新 N 件を取得
import os
def latest_files(root: str, n: int = 5) -> list[str]:
items = []
for name in os.listdir(root):
path = os.path.join(root, name)
if os.path.isfile(path):
items.append((path, os.path.getmtime(path)))
items.sort(key=lambda x: x[1], reverse=True)
return [p for p, _ in items[:n]]
print(latest_files("logs", 3))
Python例題4:隠しファイルを除外して一覧表示(UNIX 風)
import os
def list_public(root: str) -> list[str]:
names = []
for name in os.listdir(root):
if not name.startswith("."):
names.append(name)
return sorted(names, key=str.casefold)
print(list_public("."))
Pythonまとめ
os.listdir は「フォルダ直下の名前一覧」を素早く取得するための基本関数です。フルパスが必要なら os.path.join で結合、種別判定は isfile/isdir、並びは必要に応じて sorted。非再帰である点を理解し、再帰が必要なら os.walk や pathlib へ切り替える。存在・権限の例外に備え、件数が多いときは os.scandir で効率化——この基本線を押さえるだけで、初心者でも安全かつ実用的なディレクトリ処理を書けるようになります。
