【初心者向け】Pythonでフォルダ内のファイル一覧を表示しよう!|Python100本ノック Lesson 18

Pythonで学べる100のミニアプリ ロードマップ

はじめに

第17回では shutil.copy() を使って 簡易バックアップツール を作ったな。
今回はファイル操作の基礎をもう一歩進めて、「フォルダ内のファイル一覧表示ツール」 を作るで!

目的のフォルダに何が入っているか、ファイル名/サイズ/更新日時 まで確認できる実用ツールや。
まずは最小構成 → ちょい改良 → 実務でも使える拡張の順に仕上げていこう。


完成イメージ

(例:./data を対象に実行)

=== ./data の一覧 ===
report.csv
image.png
memo.txt

改良版ではこんな表示に:

report.csv    12.3 KB   2025-06-20 14:02:11
image.png     245.8 KB  2025-07-01 09:45:03
memo.txt      0.8 KB    2025-07-10 21:30:55

ヒント(使う要素)

  • import osos.listdir(path) で中身を取得
  • pathlib.Path → ファイルサイズ・更新日時取得が書きやすい
  • stat().st_size / stat().st_mtime → サイズ・更新時刻
  • datetime.fromtimestamp() → タイムスタンプを人が読める形に変換

コード全文(基本版):最小構成。まずは「名前だけ列挙」からスタートや。
# Lesson 18: フォルダ内のファイル一覧表示(基本版)
import os

target = "./"  # 調べたいフォルダ(例: "./data")
print(f"=== {target} の一覧 ===")

try:
    for name in os.listdir(target):
        print(name)
except FileNotFoundError:
    print("エラー:指定したフォルダが見つかりません。")


改良版(サイズ&更新日時を表示):pathlib を使うと読みやすく拡張しやすいで!
# Lesson 18: フォルダ内のファイル一覧表示(改良版)
from pathlib import Path
from datetime import datetime

def human_size(bytes_val: int) -> str:
    units = ["B", "KB", "MB", "GB", "TB"]
    size = float(bytes_val)
    i = 0
    while size >= 1024 and i < len(units) - 1:
        size /= 1024
        i += 1
    return f"{size:.1f} {units[i]}"

target = Path("./")  # 例: Path("./data")

if not target.exists() or not target.is_dir():
    print("エラー:指定したパスがフォルダではありません。")
else:
    rows = []
    for p in target.iterdir():
        if p.is_file():
            st = p.stat()
            size = human_size(st.st_size)
            mtime = datetime.fromtimestamp(st.st_mtime).strftime("%Y-%m-%d %H:%M:%S")
            rows.append((p.name, size, mtime))

    # 名前でソート(サイズ降順や更新日時降順にしたい場合は key を変える)
    rows.sort(key=lambda x: x[0].lower())

    for name, size, mtime in rows:
        print(f"{name:<20} {size:>8}  {mtime}")


さらに一歩:拡張版(拡張子フィルタ & 再帰表示)

  • **/*.csv のように特定拡張子だけ
  • サブフォルダも含めて再帰的に列挙
# Lesson 18: ファイル一覧(拡張版:拡張子フィルタ & 再帰)
from pathlib import Path
from datetime import datetime

def list_files(base: Path, pattern: str = "*", recursive: bool = False):
    globber = base.rglob(pattern) if recursive else base.glob(pattern)
    for p in globber:
        if p.is_file():
            st = p.stat()
            dt = datetime.fromtimestamp(st.st_mtime).strftime("%Y-%m-%d %H:%M:%S")
            print(f"{p.relative_to(base)}  ({st.st_size}B)  {dt}")

base = Path("./data")  # 対象フォルダ
print("=== CSVのみ(再帰なし)===")
list_files(base, pattern="*.csv", recursive=False)

print("\n=== すべて(再帰あり)===")
list_files(base, pattern="*", recursive=True)

実行方法

  1. VSCodeで新しいファイルを作成
  2. いずれかのコードをコピペして lesson18.py として保存
  3. ターミナルで実行: python lesson18.py (動かへん場合は python3 lesson18.py

応用アイデア

  • 並べ替え:サイズ降順・更新日時降順などでソート
  • CSV出力:一覧結果を files.csv に保存(監査・台帳用)
  • 除外パターン__pycache__ などをスキップ
  • GUI化:フォルダ選択ダイアログ(tkinter.filedialog)と連携

まとめ

今回は 「フォルダ内のファイル一覧表示」 を作ったで!
os / pathlib を使うと、名前列挙からサイズ・更新日時・フィルタ・再帰まで柔軟に扱えるようになる。
実務でも使える“ちょうどいい”ツールの第一歩や。

👉 次回は Lesson 19: 重複行削除ツール
テキスト内の重複行を消してスッキリ整形するアプリを作るで!