Python 業務自動化 | ファイル・フォルダ自動化:基本操作 - フォルダサイズ計算

Python Python
スポンサーリンク

フォルダサイズ計算は「どこがどれだけ容量を食っているか」を見抜く技術

業務自動化をしていると、
「このフォルダ、どれくらい容量を使っているんだろう?」
「バックアップ前にフォルダサイズを知りたい」
「容量が大きいフォルダを特定して整理したい」
といったニーズが必ず出てきます。

Pythonでは、フォルダ内のファイルサイズを合計することで「フォルダサイズ」を計算できます。
ポイントは「ファイルだけを足し算する」「サブフォルダをどう扱うかを決める」の2つです。


フォルダ直下だけのサイズを計算する基本形

listdir と getsize を組み合わせる

まずは「サブフォルダは無視して、直下のファイルだけ」のサイズを合計する最小コードです。

import os

folder = "data"

total = 0

for name in os.listdir(folder):
    path = os.path.join(folder, name)

    if os.path.isfile(path):
        total += os.path.getsize(path)

print("合計サイズ:", total, "bytes")
print("合計サイズ:", total / 1024 / 1024, "MB")
Python

ここで大事なのは、os.listdir() が「ファイルとフォルダの両方」を返すことです。
そのため、os.path.isfile() で「ファイルだけ」に絞り込んでから os.path.getsize() を呼んでいます。

「フォルダサイズ=中のファイルサイズの合計」という考え方が、まずは土台になります。


サブフォルダも含めてフォルダサイズを計算する

os.walk を使って階層全体をたどる

実務では、サブフォルダも含めて「フォルダ全体のサイズ」を知りたいことが多いです。
その場合は os.walk() を使います。

import os

folder = "data"

total = 0

for current, dirs, files in os.walk(folder):
    for name in files:
        path = os.path.join(current, name)
        total += os.path.getsize(path)

print("合計サイズ:", total, "bytes")
print("合計サイズ:", total / 1024 / 1024, "MB")
Python

os.walk() は、指定したフォルダ以下のすべての階層を自動でたどってくれます。
その中の files だけを対象にしてサイズを足し込むことで、「フォルダ全体のサイズ」が求まります。


人間にとって読みやすい単位に変換する

バイトから KB / MB / GB への変換

バイトのままだと直感的に分かりにくいので、業務では KB / MB / GB に変換して表示することが多いです。

def to_readable(size_bytes: int) -> str:
    for unit in ["bytes", "KB", "MB", "GB", "TB"]:
        if size_bytes < 1024 or unit == "TB":
            return f"{size_bytes:.2f} {unit}"
        size_bytes /= 1024

import os

folder = "data"
total = 0

for current, dirs, files in os.walk(folder):
    for name in files:
        path = os.path.join(current, name)
        total += os.path.getsize(path)

print("合計サイズ:", to_readable(total))
Python

このような小さなユーティリティ関数を用意しておくと、ログやレポートが一気に読みやすくなります。


例題①:バックアップ前にフォルダサイズを確認するテンプレート

シナリオ

data フォルダを丸ごとバックアップしたい。
ただし、フォルダサイズが大きすぎる場合は事前に知っておきたい。

import os

def folder_size(path: str) -> int:
    total = 0
    for current, dirs, files in os.walk(path):
        for name in files:
            f = os.path.join(current, name)
            total += os.path.getsize(f)
    return total

def to_mb(size_bytes: int) -> float:
    return size_bytes / 1024 / 1024

target = "data"
size = folder_size(target)

print("バックアップ対象フォルダ:", target)
print(f"サイズ: {to_mb(size):.2f} MB")
Python

このテンプレートをベースに、「サイズが◯MBを超えていたら警告する」「ログに記録する」といった処理を簡単に追加できます。


例題②:プロジェクト内で「重いフォルダ」をランキングする

シナリオ

project 配下のサブフォルダごとにサイズを計算し、「どのフォルダが一番容量を食っているか」を知りたい。

import os

def folder_size(path: str) -> int:
    total = 0
    for current, dirs, files in os.walk(path):
        for name in files:
            f = os.path.join(current, name)
            total += os.path.getsize(f)
    return total

root = "project"
results = []

for name in os.listdir(root):
    path = os.path.join(root, name)
    if os.path.isdir(path):
        size = folder_size(path)
        results.append((path, size))

results.sort(key=lambda x: x[1], reverse=True)

for path, size in results:
    print(f"{path}: {size / 1024 / 1024:.2f} MB")
Python

これで、「どのフォルダから整理すべきか」が一目で分かるようになります。
サーバーの容量逼迫対策や、古いプロジェクトの整理にとても役立ちます。


pathlib を使った、少しモダンで読みやすい書き方

Path.rglob を使ってファイルを列挙する

from pathlib import Path

def folder_size(path: Path) -> int:
    total = 0
    for p in path.rglob("*"):
        if p.is_file():
            total += p.stat().st_size
    return total

folder = Path("data")
size = folder_size(folder)

print("合計サイズ:", size, "bytes")
print("合計サイズ:", size / 1024 / 1024, "MB")
Python

pathlib を使うと、パス操作がオブジェクト指向的になり、コードの読みやすさがかなり上がります。
rglob("*") は「サブフォルダを含めてすべてのパスを列挙する」という意味です。


フォルダサイズ計算を業務で使うときの考え方

フォルダサイズ計算は、単なる「合計値」ではなく、業務上の判断材料になります。

バックアップ前に「どれくらいの容量をコピーするのか」を把握する。
サーバーの容量逼迫時に「どのフォルダから手を付けるか」を決める。
定期的にサイズをログに残して「増え方の傾向」を見る。

そのために大事なのは、次の3点です。

フォルダサイズ=中のファイルサイズの合計であると理解すること。
サブフォルダを含めるかどうかを明確に決めること。
人間が読める単位(MB / GB)に変換して扱うこと。

まずは、あなたの PC の中で「重そうだな」と感じているフォルダを一つ選んで、
今日の folder_size 関数をそのまま試してみてください。
数字で「重さ」が見えるようになると、次にやるべき整理や自動化のアイデアが自然と浮かんできます。

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