最稳妥清空缓存的方式是先用shutil.rmtree删除整个目录,再用os.makedirs(path, exist_ok=true)重建空目录;该方法不依赖文件名规则,可可靠处理隐藏文件、只读文件及符号链接,且出错时能立即暴露问题而非静默失败。

用 shutil.rmtree + os.makedirs 最稳妥
直接删掉整个文件夹再重建,是清空缓存最可靠的方式——它不依赖文件名规则,也不怕隐藏文件、只读文件或符号链接干扰。很多脚本用 os.listdir 配合 os.remove,结果遇到 PermissionError 或 IsADirectoryError 就中断了。
实操建议:
- 先用
shutil.rmtree删除目标路径,再用os.makedirs(path, exist_ok=True)重建空目录 - 务必加
ignore_errors=False(默认值),这样出错能立刻暴露问题,而不是静默跳过 - 如果路径可能不存在,
shutil.rmtree会抛FileNotFoundError,需主动捕获,不能假设“删之前一定存在”
import shutil import os <p>cache_dir = "/tmp/myapp/cache" try: shutil.rmtree(cache_dir) except FileNotFoundError: pass # 目录本来就没有,没问题 os.makedirs(cache_dir, exist_ok=True) </p>
想保留文件夹但只删内容?小心 os.scandir 的权限陷阱
有些场景要求保留目录本身(比如它被其他进程硬绑定在某个路径上),这时得遍历并逐个删除子项。别用 os.listdir + os.remove/os.rmdir 组合——它无法区分文件和子目录,也处理不了 Windows 下的只读文件。
推荐用 os.scandir(Python 3.5+),它返回 DirEntry 对象,自带 .is_file() 和 .is_dir() 方法,还能通过 .stat().st_file_attributes(Windows)或 .stat().st_mode(Unix)提前判断权限。
实操建议:
- 对每个
entry,先尝试os.unlink(entry.path);失败则用shutil.rmtree(entry.path) - Linux/macOS 下常见错误是
PermissionError: [Errno 13] Permission denied,通常因为文件有chmod -r属性,需先os.chmod(entry.path, 0o755)再删 - Windows 下注意
entry.path可能含长路径(>260 字符),需在开头加\?前缀,否则os.unlink报错
glob 匹配清理适合有明确命名规律的缓存
如果你的缓存文件都带 .tmp、.cache 后缀,或按日期命名(如 log_202405*.log),glob 是最快捷的过滤手段。但它不递归进子目录,也不处理文件属性,纯靠名字匹配。
实操建议:
- 用
glob.glob(os.path.join(cache_dir, "*.tmp"))获取路径列表,再用os.unlink批量删 - 要递归匹配子目录,必须加
**并设recursive=True,例如glob.glob(f"{cache_dir}/**/*.pyc", recursive=True) - 注意
glob不保证顺序,如果某些文件依赖其他文件存在(比如 .idx 必须等 .data 删完才能删),得自己排序或分步执行 - Windows 下
glob对大小写不敏感,Linux 下敏感,跨平台脚本要留意
别忽略缓存目录本身的权限和挂载状态
再正确的代码,遇上 /var/cache 这种由 systemd-tmpfiles 管理的目录,或者 NFS 挂载的远程缓存路径,就可能失效。这时候 shutil.rmtree 会卡住或报 OSError: [Errno 5] Input/output error。
实操建议:
- 运行前先检查
os.stat(cache_dir).st_dev是否与根目录一致,避免误操作挂载点 - 用
os.access(cache_dir, os.W_OK)确认写权限,比捕获异常更早发现问题 - 容器环境里,宿主机映射的缓存目录可能被设为
ro(只读),此时任何删除操作都会失败,得改用 volume 清理策略
真正麻烦的从来不是“怎么删”,而是“为什么删不掉”——路径是否被占用、权限是否被继承、文件系统是否只读,这些细节比语法更重要。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











