Python 查找大文件:定位磁盘空间杀手
用 Python 递归扫描目录,按文件大小排序列出最大的文件,快速定位占空间的视频、备份、安装包,附大小阈值过滤和 Top N 输出。
场景痛点
磁盘红了,不知道空间被谁吃了。Windows 自带的存储感知要等半天,想快速找出哪个文件夹、哪个文件最大,手动右键看属性太慢。用 Python 递归扫一遍目录,按大小排序,把 Top 20 大文件连同路径和大小打印出来,30 秒定位到那个 5GB 的旧视频备份。
用到的库
纯标准库,无需 pip 安装:
# os 为标准库
完整代码
import os
# ========== 配置区 ==========
SCAN_DIR = "D:/" # 要扫描的根目录(Windows 用正斜杠也能识别)
TOP_N = 20 # 显示前 N 大文件
MIN_SIZE_MB = 100 # 只看大于这个大小的文件
# ============================
def human_size(n: float) -> str:
"""把字节转成易读字符串。"""
for unit in ["B", "KB", "MB", "GB", "TB"]:
if n < 1024:
return f"{n:.2f} {unit}"
n /= 1024
return f"{n:.2f} PB"
def main():
if not os.path.isdir(SCAN_DIR):
print(f"目录不存在:{SCAN_DIR}")
return
threshold = MIN_SIZE_MB * 1024 * 1024
big_files = []
for dirpath, _, filenames in os.walk(SCAN_DIR):
for name in filenames:
p = os.path.join(dirpath, name)
try:
size = os.path.getsize(p)
except (PermissionError, OSError):
continue
if size >= threshold:
big_files.append((size, p))
# 按大小降序
big_files.sort(reverse=True)
print(f"扫描完成,共 {len(big_files)} 个大于 {MIN_SIZE_MB}MB 的文件,Top {TOP_N}:\n")
print(f"{'大小':>12} 路径")
print("-" * 80)
total = 0
for size, p in big_files[:TOP_N]:
print(f"{human_size(size):>12} {p}")
total += size
print("-" * 80)
print(f"这 {min(TOP_N, len(big_files))} 个文件合计 {human_size(total)}")
if __name__ == "__main__":
main()
代码讲解
- os.walk 递归:扫遍 SCAN_DIR 下所有子目录的文件,拿到每个文件的完整路径和大小。
- MIN_SIZE_MB 阈值:只记录大于 100MB 的文件,小文件直接忽略,列表干净。想看全部就把阈值调小。
- human_size:把字节数自动换算成 B/KB/MB/GB,打印出来直接看得懂,不用自己除 1024。
- sort(reverse=True):按大小降序排,最大的排最前,切片
[:TOP_N]只取前 N 个。 - 异常跳过:没权限访问的系统文件、正在被占用的文件,
try/except跳过,不让一个错误中断整个扫描。
运行结果
终端打印一张表,每行是一个大文件的大小和完整路径,底部合计这 Top N 个文件占了多少空间。从表里一眼就能看到该删哪个、该移到移动硬盘的是哪个。
注意事项
- 扫整盘耗时:扫 C 盘、整个 D 盘可能要几分钟,文件越多越慢,第一次扫可以先扫一个文件夹试水。
- 权限:扫系统盘会遇到
System Volume Information这类没权限目录,脚本已经跳过,不影响。 - 别直接删:本脚本只列清单不删文件。看清楚是什么再决定——可能是虚拟内存、系统还原点,别手贱删错。
- 硬链接:硬链接文件在多个路径显示同一大小,删之前搞清是不是硬链接,别以为是重复就删。
- 要看目录占比:本脚本是按文件列。想看"哪个文件夹最占地方",可以在遍历时按目录累加大小再排序。

更新时间:2026-09-14 21:17:56