Python | ファイル操作など:os.listdir

Python
スポンサーリンク

概要(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 で効率化——この基本線を押さえるだけで、初心者でも安全かつ実用的なディレクトリ処理を書けるようになります。

タイトルとURLをコピーしました