os.walk默认返回相对路径,需用os.path.join拼接完整路径并优先转为绝对路径;匹配文件应限定后缀、避开白名单;删除时须捕获PermissionError并处理;pathlib更适长路径但灵活性不如os.walk。

os.walk 遍历出来的路径为什么总是相对路径?
默认情况下 os.walk 返回的 root、dirs、files 都是相对于你传入起始路径的相对表示,不是绝对路径。直接拼接删除容易删错目录——比如你在 /home/user 下运行脚本,却传了 "Downloads" 当起始路径,os.walk 返回的 root 就是 "Downloads/.tmp" 这种,没加 os.path.abspath() 就可能误删当前工作目录下的同名文件夹。
- 始终用
os.path.join(root, file)拼接完整路径,别手动字符串拼接(Windows 路径分隔符会出问题) - 如果要从固定位置开始遍历,起始路径必须用
os.path.abspath("xxx")或Path("xxx").resolve()转成绝对路径 -
os.walk默认不进软链接目录,如需处理符号链接,得显式传followlinks=True,但要小心循环引用
哪些文件该删?匹配规则写错就变「删库跑路」
自动化删垃圾最危险的不是技术,是匹配逻辑太宽泛。比如用 if ".log" in filename: 会把 myapp.log.bak、log_parser.py 全干掉;又或者正则写成 r".*.tmp$" 却忘了 re.match 从头匹配,实际该用 re.fullmatch 或 str.endswith() 更安全。
- 优先用
str.endswith((".tmp", ".log", ".cache")),比in和正则更准、更快 - 临时文件常见后缀:
".tmp"、".temp"、".swp"、".DS_Store"(macOS)、"Thumbs.db"(Windows) - 避免匹配整个路径,只对
filename或os.path.basename(filepath)判断 - 加个白名单保护机制:比如跳过
__pycache__目录,或遇到"important_data.xlsx"直接 continue
os.remove 报 PermissionError 怎么办?
常见于 Windows 上文件被占用(比如日志正被程序写入),或 Linux/macOS 下权限不足(如 root 创建的缓存文件)。直接崩掉会让整个清理中断,而忽略错误又可能掩盖真实问题。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 必须用
try/except OSError包住os.remove(),PermissionError是OSError子类 - 不要静默吞掉所有异常——打印出错路径和
str(e),否则下次找不到谁卡住了 - 对只读文件可先尝试
os.chmod(filepath, stat.S_IWRITE)再删(Windows 有效,Linux/macOS 效果有限) - 如果批量删大量小文件,频繁系统调用慢,可考虑用
shutil.rmtree()清空整个临时目录(但务必确认目录路径绝对正确)
Python 3.12+ 推荐用 pathlib 替代 os.path?
可以,但不是必须。pathlib 的 Path.rglob() 写起来更直观,比如 list(Path("Downloads").rglob("*.tmp")),但底层仍是调用 os.scandir,性能差异微乎其微。真正要注意的是:pathlib 在 Windows 上对长路径支持更好(自动启用 \? 前缀),而老式 os.walk 可能抛 WindowsError: [Error 206] 文件名或扩展名太长。
- 若项目已用 pathlib,统一风格用
Path().rglob()没问题;若只是简单脚本,os.walk更轻量、兼容性更好(Py3.6+ 都稳) -
Path().rglob()不返回目录层级信息,没法像os.walk那样边遍历边过滤子目录,灵活性略低 - 跨平台脚本里,别混用
os.path.join和Path / "sub",容易因斜杠方向引发 bug
真正麻烦的从来不是遍历或删除本身,而是判断“这到底是不是垃圾”——浏览器下载一半的 .part 文件、IDE 正在写的 .swp、还有你自己忘了命名的 untitled.txt,它们都长着垃圾的脸,但删了就回不来。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










