我的知识记录

Python按文件大小批量筛选移动教程

用Python扫描目录,按文件大小区间(如大于100MB、小于1KB)批量筛选,自动移动到分类文件夹,清理磁盘空间超实用。

场景痛点

C盘红了,不知道哪些大文件占地方。资源管理器按大小排序只能在当前文件夹看,跨目录找大文件根本无从下手。用Python扫一遍指定目录,把大于500MB的文件全挑出来列清单,再自动移到"大文件待清理"文件夹,确认后删,磁盘空间一下就腾出来了。小到几KB的临时文件也能批量挑出来清理。

用到的库

pip install openpyxl

核心用标准库 ospathlibshutil,导出清单用 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 来筛,适合找缓存垃圾。

Python按文件大小批量筛选移动教程

标签:

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

上一篇:Python按文件MD5查找重复文件教程

下一篇:Python解压zip压缩包教程:一行代码完整提取