我的知识记录

Python清理临时文件过期文件:按天数自动删除旧文件

用Python扫描目录删除超过指定天数的临时文件和过期文件,支持按后缀过滤、先预览后删除,安全清理磁盘空间。

场景痛点

下载目录、日志目录、临时输出目录用久了塞满几个月前的旧文件,占磁盘空间还找不到有用的东西。手动按修改时间排序再删,几百个文件点到手软,还怕误删重要文件。用Python脚本按天数过滤,先打印将要删除的文件清单确认,再执行删除。

用到的库

pathlib   # 标准库
datetime  # 标准库,时间计算

完整代码

import time
from pathlib import Path
from datetime import datetime, timedelta


def clean_old_files(
dir_path: str,
days: int = 30,
suffix_filter: list = None,
dry_run: bool = True
) -> dict:
"""
删除目录下超过指定天数的文件
:param dir_path: 要清理的目录
:param days: 保留天数,超过则删除
:param suffix_filter: 只清理指定后缀,如 ['.tmp', '.log'];None清理全部
:param dry_run: True只预览不删除,False才真正删除
"""
root = Path(dir_path)
cutoff = time.time() - days * 86400  # 86400秒=1天
suffix_filter = [s.lower() for s in (suffix_filter or [])]

stats = {"deleted": 0, "skipped": 0, "freed_bytes": 0}

for file in root.rglob('*'):
if not file.is_file():
continue
# 后缀过滤
if suffix_filter and file.suffix.lower() not in suffix_filter:
continue
# 修改时间判断
mtime = file.stat().st_mtime
if mtime >= cutoff:
stats["skipped"] += 1
continue

size = file.stat().st_size
mtime_str = datetime.fromtimestamp(mtime).strftime('%Y-%m-%d')
print(f"[{'预览' if dry_run else '删除'}] {file}  ({size/1024:.1f}KB, 修改于{mtime_str})")

if not dry_run:
try:
file.unlink()
stats["deleted"] += 1
stats["freed_bytes"] += size
except Exception as e:
print(f"  删除失败: {e}")

print(f"\n{'预览' if dry_run else '清理'}完成:")
print(f"  将删除/已删除: {stats['deleted']} 个")
print(f"  跳过(未过期): {stats['skipped']} 个")
if not dry_run:
print(f"  释放空间: {stats['freed_bytes']/1024/1024:.2f} MB")
return stats


if __name__ == "__main__":
# 先 dry_run=True 预览将要删除的文件
clean_old_files(
dir_path="./temp",
days=30,
suffix_filter=['.tmp', '.log', '.bak'],
dry_run=True
)
# 确认无误后改成 dry_run=False 执行真正删除

代码讲解

  • cutoff = time.time() - days * 86400:计算截止时间戳。当前时间减去N天的秒数(一天86400秒),早于这个时间的文件就是过期文件。
  • file.stat().st_mtime:文件最后修改时间。脚本把它和cutoff比较,小于cutoff说明过期。
  • dry_run=True:默认只预览不删除,打印每个将要删除的文件路径和大小。确认清单没问题后改成False才真正unlink删除。这是防止误删的关键设计。
  • file.unlink():删除单个文件。删除目录用rmdir(),但空目录才可以删;非空目录需要shutil.rmtree()
  • suffix_filter:限制只清理.tmp.log这类临时文件,避免误删其他重要文件。

运行结果

预览模式下,脚本打印所有超过30天的.tmp/.log/.bak文件路径和大小:

[预览] temp/旧日志.log  (152.3KB, 修改于2026-07-10)
[预览] temp/备份.bak  (2048.0KB, 修改于2026-06-22)

预览完成:
将删除/已删除: 2 个
跳过(未过期): 5 个

dry_run改成False再跑一次,真正删除并统计释放空间。

注意事项

  • 一定要先dry_run预览。脚本删错文件回收站都找不回来,预览确认清单是底线。
  • rglob('*')会递归所有子目录。如果只想清理当前层,换成iterdir()
  • 正在被程序占用的文件删除会失败(Windows尤其明显),脚本捕获异常继续处理下一个,不影响整体。
  • 系统目录(如Windows的C:\Windows\Temp)需要管理员权限,普通用户跑会报PermissionError,建议只清理自己业务目录。

Python清理临时文件过期文件:按天数自动删除旧文件

标签:

更新时间:2026-09-14 21:24:05

上一篇:Python对比两个文件夹差异:一键找出新增删除修改文件

下一篇:Python批量压缩文件为zip教程:一行命令搞定多文件打包