Python按文件大小批量筛选移动教程
用Python扫描目录,按文件大小区间(如大于100MB、小于1KB)批量筛选,自动移动到分类文件夹,清理磁盘空间超实用。
场景痛点
C盘红了,不知道哪些大文件占地方。资源管理器按大小排序只能在当前文件夹看,跨目录找大文件根本无从下手。用Python扫一遍指定目录,把大于500MB的文件全挑出来列清单,再自动移到"大文件待清理"文件夹,确认后删,磁盘空间一下就腾出来了。小到几KB的临时文件也能批量挑出来清理。
用到的库
pip install openpyxl
核心用标准库 os、pathlib、shutil,导出清单用 openpyxl。
完整代码
import os
import shutil
from pathlib import Path
from openpyxl import Workbook
def human_size(n: int) -> str:
"""把字节数转成人类可读格式。"""
for unit in ("B", "KB", "MB", "GB"):
if n < 1024:
return f"{n:.1f}{unit}"
n /= 1024
return f"{n:.1f}TB"
def filter_by_size(root_dir: str, min_mb: float = 0,
max_mb: float = None,
extensions: list = None):
"""
按大小区间筛选文件。
min_mb: 最小文件大小(MB),0 表示不限下限
max_mb: 最大文件大小(MB),None 表示不限上限
"""
root = Path(root_dir)
min_bytes = min_mb * 1024 * 1024
max_bytes = max_mb * 1024 * 1024 if max_mb else float("inf")
exts = {e.lower() for e in extensions} if extensions else None
hits = []
for dirpath, _, filenames in os.walk(root):
for name in filenames:
p = Path(dirpath) / name
if exts and p.suffix.lower() not in exts:
continue
try:
size = p.stat().st_size
except OSError:
continue
if min_bytes <= size <= max_bytes:
hits.append({"path": str(p), "size": size,
"size_human": human_size(size)})
hits.sort(key=lambda x: x["size"], reverse=True)
return hits
def move_files(results: list, dst_dir: str):
"""把命中的文件统一移动到 dst_dir 下,重名加序号。"""
dst = Path(dst_dir)
dst.mkdir(parents=True, exist_ok=True)
moved = []
for item in results:
src = Path(item["path"])
target = dst / src.name
# 重名加序号
i = 1
while target.exists():
target = dst / f"{src.stem}_{i}{src.suffix}"
i += 1
try:
shutil.move(str(src), str(target))
moved.append(str(target))
except OSError as e:
print(f"移动失败 {src}: {e}")
return moved
def export_to_excel(results: list, out_path: str):
wb = Workbook()
ws = wb.active
ws.title = "大小筛选结果"
ws.append(["序号", "文件路径", "大小", "大小(MB)"])
for idx, item in enumerate(results, 1):
ws.append([idx, item["path"], item["size_human"],
round(item["size"] / 1024 / 1024, 2)])
ws.column_dimensions['A'].width = 8
ws.column_dimensions['B'].width = 90
ws.column_dimensions['C'].width = 12
ws.column_dimensions['D'].width = 12
wb.save(out_path)
if __name__ == "__main__":
ROOT = r"D:\工作资料"
# 筛选大于100MB的文件
BIG = filter_by_size(ROOT, min_mb=100)
print(f"找到 {len(BIG)} 个大于100MB的文件:")
for item in BIG[:20]:
print(f" {item['size_human']:>10} {item['path']}")
export_to_excel(BIG, r"D:\工作资料\大文件清单.xlsx")
# 确认无误后取消注释再移动,避免误操作
# move_files(BIG, r"D:\工作资料\大文件待清理")
代码讲解
human_size 把字节数自动转成B/KB/MB/GB,打印出来直观。filter_by_size 把MB参数转成字节做比较,max_mb=None 时上限设成 float("inf"),表示不限。结果按字节数倒序排,最大的文件排最前面,一眼看到占空间的大户。move_files 里重名处理和复制那篇一样,加序号避免覆盖。关键是最后移动那行默认注释掉——先看清单,确认没问题再放开注释执行,这是保护动作。
运行结果
控制台打印前20个大文件的大小和路径,同时生成 大文件清单.xlsx。检查完清单,确认要清理的,取消最后一行注释重新跑一遍,文件就全移到"大文件待清理"文件夹了。
注意事项
- 移动操作不可逆,第一次跑只导出清单,确认后再执行移动。
- 系统目录(Windows、Program Files)不要扫,会扫到系统文件。
- 网盘同步文件夹里的文件移动后网盘会重新同步,注意流量。
- 小于1KB的文件用
min_mb=0, max_mb=0.001来筛,适合找缓存垃圾。

更新时间:2026-09-14 21:18:55