安全删除临时文件和空目录需先用os.path.exists()与isfile()/isdir()校验路径,过滤.tmp/~/.swp等后缀;空目录用os.rmdir()而非shutil.rmtree();硬编码TEMP子路径防误删根目录。

如何安全删除临时文件和空目录
直接用 os.remove() 或 shutil.rmtree() 清理前,必须先判断路径是否存在、是否为预期类型,否则会抛出 FileNotFoundError 或误删非目标内容。尤其在遍历 temp 目录时,常见错误是把用户文档目录当成了临时路径。
- 先用
os.path.exists()和os.path.isfile()/os.path.isdir()做双重校验 - 对疑似临时文件加后缀过滤:检查是否以
.tmp、~、.swp结尾,或文件名含__pycache__ - 空目录需单独处理:用
os.listdir(path)判断是否为空,再调用os.rmdir()(比shutil.rmtree()更安全) - 避免递归清理根目录:硬编码起始路径,如
os.path.join(os.environ.get('TEMP'), 'myapp'),而非'/'或'C:\'
怎样批量移动旧日志到归档目录
用 shutil.move() 比复制+删除更高效,但要注意目标路径的父目录必须存在,否则会报 FileNotFoundError。日志文件通常按修改时间筛选,不是创建时间——os.path.getmtime() 才是关键。
- 用
glob.glob('*.log')或pathlib.Path().rglob('*.log')获取候选文件 - 过滤条件示例:
if time.time() - os.path.getmtime(f) > 30 * 86400(30天前) - 归档前确保目录存在:
os.makedirs(archive_dir, exist_ok=True) -
shutil.move(src, dst)在同磁盘下是原子重命名,跨磁盘才真正复制;若 dst 已存在,会覆盖——务必加if not os.path.exists(dst):防冲突
为什么 shutil.copy2() 比 copy() 更适合备份配置文件
shutil.copy() 只复制内容和权限,丢失访问/修改时间戳与扩展属性;而配置文件常被监控工具(如 inotify 或 git)依赖时间戳判断变更。用错会导致备份后程序误判“配置未更新”。
-
shutil.copy2()保留atime、mtime和stat元数据,copy()不保留 - 若目标路径已存在且是目录,
shutil.copy2(src, dst_dir)会把文件放入该目录;但dst_dir必须存在,否则报错 - 小文件建议用
copy2(),大文件(>100MB)可考虑分块读写避免内存峰值,此时shutil.copyfileobj()更可控
os.walk() 遍历时如何跳过特定子目录
os.walk() 默认递归所有子目录,但像 .git、node_modules、venv 这类目录既不需要清理也不应触发权限错误。跳过方式不是靠 continue,而是修改 dirs 列表本身——这是唯一生效的时机。
立即学习“Python免费学习笔记(深入)”;
- 在
for root, dirs, files in os.walk(top)循环内,直接修改dirs[:] = [d for d in dirs if d not in ('.git', 'venv')] - 不能写
dirs = [...](重新赋值无效),必须原地替换(dirs[:]) - 大小写敏感:Windows 下
'VENV'和'venv'是不同字符串,建议统一转小写比对 - 如果某层目录无权访问(如系统保护目录),
os.walk()默认跳过并静默,可通过onerror参数捕获异常做日志
实际运行时最易忽略的是当前工作目录(os.getcwd())与脚本路径(os.path.dirname(<strong>file</strong>))的混淆——清理逻辑若基于相对路径,换位置执行就可能删错地方。宁可显式拼接绝对路径,也不要依赖 cd 后的手动切换。


















