Python清理临时文件需动态获取路径、按时间/后缀安全过滤、用pathlib.unlink和rmtree配合异常处理,并通过系统调度定期执行。

Python 本身不直接提供跨平台的“清理系统临时文件”能力,os 和 shutil 只能帮你删文件,但删什么、在哪删、能不能删,得靠你明确路径和规则——否则容易误删、权限失败或清理无效。
怎么安全定位系统临时目录(Windows/macOS/Linux通用)
别硬写 C:\Users\XXX\AppData\Local\Temp 或 /tmp,不同用户、不同系统、不同 Python 运行环境(比如以服务方式运行)下路径可能不同。必须用标准库动态获取:
-
tempfile.gettempdir()返回当前 Python 进程默认临时目录(通常可靠,但不等于系统级所有缓存) -
os.environ.get('TEMP') or os.environ.get('TMP')(Windows) -
os.environ.get('TMPDIR')(macOS/Linux) - 用户级缓存如
~/.cache(Linux/macOS)或%LOCALAPPDATA%\Cache(Windows)需手动拼接,用pathlib.Path.home()构建
示例:
from pathlib import Path
import os
import tempfile
<p>def get_system_temp():</p><h1>优先取环境变量,fallback 到 tempfile</h1><pre class="brush:php;toolbar:false;">return Path(os.environ.get('TMPDIR',
os.environ.get('TEMP',
os.environ.get('TMP', tempfile.gettempdir()))))def get_user_cache(): if os.name == 'nt': return Path(os.environ.get('LOCALAPPDATA')) / 'Cache' else: return Path.home() / '.cache'
哪些文件/目录可以放心删?关键看时间 + 后缀 + 所有权
盲目递归删除整个 Temp 目录极危险:正在被其他进程读写的文件会删失败(PermissionError),已锁定的文件可能残留,甚至导致程序崩溃。稳妥做法是:
- 只删「超过 7 天未访问」的文件(用
stat().st_atime)或「超过 3 天未修改」(st_mtime)——避免刚生成就被干掉 - 跳过正在执行的文件(
.pyc、.so等可跳过;但.lock文件建议保留) - 过滤常见无害后缀:
['.tmp', '.log', '.cache', '.dat', '.part'],但不要删.dll、.exe、.dylib - 跳过非空子目录(除非明确知道是某应用的缓存目录,如
pip\Cache)
注意:os.walk() 遇到权限错误会中断,要用 onerror 回调忽略;shutil.rmtree() 对只读文件会失败,得先 os.chmod(path, 0o777)。
如何让脚本定期执行(不依赖 crontab 或任务计划程序)
Python 脚本自己“定时”不可靠(进程退出就停了),真正可行的是把它做成被调度系统调用的命令。但你可以用轻量方式降低运维成本:
- Linux/macOS:把脚本保存为
clean_temp.py,加执行权限,写一行 crontab:0 3 * * * /usr/bin/python3 /path/to/clean_temp.py >> /var/log/clean_temp.log 2>&1 - Windows:用
schtasks命令注册,避免 GUI 权限问题(尤其要删%LOCALAPPDATA%时):schtasks /create /tn "CleanTemp" /tr "python C:\scripts\clean_temp.py" /sc daily /st 03:00 /rl HIGHEST
- 如果坚持纯 Python 方案,可用
schedule库 + 后台进程(不推荐生产),但必须处理 SIGTERM、日志轮转、重复启动等问题
为什么不能用 os.remove() 直接删所有匹配文件
因为 os.remove() 对目录报 IsADirectoryError,对只读文件报 PermissionError,对正被占用的文件在 Windows 上直接失败。更糟的是,它不告诉你“删到哪出错了”,脚本静默中断。
正确组合是:
- 用
pathlib.Path.unlink(missing_ok=True)安全删文件(Python 3.8+) - 删目录前先确认是空的:
not any(p.iterdir()),再用rmtree() - 捕获并记录具体异常:
except (PermissionError, OSError) as e: logger.warning(f"Skip {p}: {e}") - 永远用
try/except包裹单个文件操作,而不是整个目录遍历
最易被忽略的一点:清理脚本自身的日志文件,如果也放在 temp 目录下,可能某次就被自己删掉——务必把日志写到固定位置,比如 /var/log/ 或 %PROGRAMDATA%。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











