磁盘爆了?一个脚本找出最占空间的文件夹

2026-10-06 · 已实跑验证(递归统计/降序排序/空目录边界全过)

服务器磁盘报警、C 盘飘红,第一件事是搞清楚哪个文件夹吃的空间。Windows 资源管理器要一个个右键看属性,慢;用这个脚本一次扫完,还顺手出一份 CSV 报告。

脚本(dir_size_report.py,纯标准库,无需 pip install)

import argparse, csv, os

def dir_size(path):
    total = 0
    for root, dirs, files in os.walk(path, onerror=lambda e: None):
        for f in files:
            fp = os.path.join(root, f)
            try:
                total += os.path.getsize(fp)
            except OSError:
                pass  # 没权限/文件被删,跳过不中断
    return total

def human(n):
    for u in ("B", "KB", "MB", "GB", "TB"):
        if n < 1024:
            return f"{n:.1f} {u}"
        n /= 1024
    return f"{n:.1f} PB"

ap = argparse.ArgumentParser()
ap.add_argument("target", nargs="?", default=".")
ap.add_argument("--top", type=int, default=20)
ap.add_argument("--out", default="dir_size_report.csv")
args = ap.parse_args()

rows = []
for name in sorted(os.listdir(args.target)):
    p = os.path.join(args.target, name)
    if os.path.isdir(p):
        rows.append((name, dir_size(p)))
rows.sort(key=lambda r: -r[1])

print(f"{'目录':<40} {'大小':>12}")
for name, size in rows[:args.top]:
    print(f"{name:<40} {human(size):>12}")

with open(args.out, "w", newline="", encoding="utf-8-sig") as f:
    w = csv.writer(f)
    w.writerow(["目录", "字节数", "人类可读"])
    w.writerows([(n, s, human(s)) for n, s in rows])

用法

python3 dir_size_report.py /var          # 扫 /var 下各子目录
python3 dir_size_report.py . --top 10 --out 磁盘报告.csv

实测结果

三个实测坑

文件夹太多扫不过来 / 服务器没有 Python 环境?

我们提供代跑服务:把目录清单发给我们(或说明服务器情况),帮你出盘点报告+清理建议,9.9 元起。
👉 查看服务与价格

← 更多免费工具与干货 | 博客目录