Python自动清理过期日志脚本_os模块与文件路径操作实践

应先用 os.path.isdir() 校验日志目录存在且为目录,再用绝对路径调用 os.listdir();遍历时用 os.path.isfile() 过滤文件,删除时据类型选 os.remove() 或 shutil.rmtree(),并记录具体错误。

如何用 os.listdir() 安全获取日志目录下的文件列表

直接遍历目录前,必须先确认路径存在且是目录,否则 os.listdir() 会抛出 FileNotFoundErrorNotADirectoryError。尤其在定时任务中,日志目录可能被手动删除或权限变更,脚本不能因此中断。

实操建议:

文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

下载

  • os.path.isdir(path) 提前校验,不依赖异常捕获做流程控制
  • 避免用 os.listdir(".") 这类相对路径——定时任务的工作目录不可靠,始终用绝对路径(如 /var/log/myapp/
  • 过滤掉子目录:对每个 entry 调用 os.path.isfile(os.path.join(log_dir, entry)),防止误删整个子目录

os.path.getmtime() 判断日志是否过期时要注意时区与精度

os.path.getmtime() 返回的是 Unix 时间戳(秒级),但它的值取决于文件系统记录的最后修改时间——而很多日志轮转工具(如 logrotate)会保留原文件 mtime,导致“看似没过期”却实际该删。更稳妥的方式是按文件名中的日期解析(如 app.log.2025-03-15),但若只能依赖 mtime,就得注意两点:

  • 不要用 datetime.now() - mtime > 86400 * 7 简单比较:datetime.now() 默认是本地时区,而 mtime 是 UTC 秒数,跨时区机器上可能偏差整小时
  • 统一用 time.time() 获取当前时间戳,和 os.path.getmtime() 类型一致,避免类型转换引入误差
  • 考虑文件系统挂载参数(如 noatime 不影响 mtime,但某些容器环境可能禁用 mtime 更新)

删除前务必用 os.remove() 而非 shutil.rmtree(),除非明确要删目录

日志文件通常是普通文件,不是目录。如果误把 shutil.rmtree() 用在单个文件上,会报错 OSError: [Errno 20] Not a directory;反过来,若日志目录下混有子目录(比如按日期分的 2025-03/),又只用 os.remove(),则跳过整个子目录,造成清理遗漏。

实操建议:

  • 先用 os.path.isfile() 判定目标类型,再选 os.remove()shutil.rmtree()
  • 删除失败时记录具体错误:比如 PermissionError 表示权限不足,ProcessLookupError(Windows)或 EBUSY(Linux)说明文件正被写入——此时应跳过,而非重试或强制 kill 进程
  • 避免用 os.system("rm -f ..."):无法精确捕获错误码,且 shell 注入风险在拼接路径时真实存在

脚本部署后常被忽略的执行上下文问题

本地测试通过的脚本,放到 cron 里就失败,90% 是因为环境差异。Python 解释器路径、PATH、当前工作目录、用户权限、字符编码全部不同。

关键检查点:

  • 在 crontab 中显式指定 Python 路径:/usr/bin/python3 /opt/scripts/clean_logs.py,别用 pythonpython3
  • 脚本开头加 #!/usr/bin/env python3chmod +x 不够——cron 默认不读 shell 的 .bashrc,PATH 往往只有 /usr/bin:/bin
  • 所有日志路径、配置路径都写绝对路径,不要依赖 __file__ 拼接(__file__ 在 symlink 场景下可能指向软链源而非实际位置)
  • logging.FileHandler 记录操作日志时,确保日志目录存在且目标用户有写权限——否则连错误都记不了

真正麻烦的从来不是“怎么删”,而是“删的时候谁在写、删完谁在读、删失败了有没有人知道”。路径、权限、时间判断这三块,漏一个,脚本就从工具变成隐患。

相关推荐:

迷你世界2026韶春公主蝶绣儿不过期激活码

游戏迷你世界中,在2026年的今日分享给大家韶春公主蝶绣儿的不过期激活码,只要使用2026年韶春公主蝶绣儿的未过期激活码即可免费获得这个角色,想要的玩家可以拿着激活码到游戏中去兑换就可以拥有这个角色啦。 详细答案: AC9baed110616806226f5c 点击查看迷你世界2026不过期激活码汇总 本文内容来源于互联网,如有侵权请联系删除。

迷你世界2026圣洁颂歌洛聆不过期激活码

游戏迷你世界中,在2026年的今日分享给大家圣洁颂歌洛聆的不过期激活码,只要使用2026年圣洁颂歌洛聆的未过期激活码即可免费获得这个角色,想要的玩家可以拿着激活码到游戏中去兑换就可以拥有这个角色啦。 详细答案: CRd39f7a1061682c42e192 点击查看迷你世界2026不过期激活码汇总 本文内容来源于互联网,如有侵权请联系删除。

迷你世界2026绘彩芽不过期激活码

游戏迷你世界中,在2026年的今日分享给大家绘彩芽的不过期激活码,只要使用2026年绘彩芽的未过期激活码即可免费获得这个角色,想要的玩家可以拿着激活码到游戏中去兑换就可以拥有这个角色啦。 详细答案: WU363e08105793b19ca0cb 点击查看迷你世界2026不过期激活码汇总 本文内容来源于互联网,如有侵权请联系删除。

迷你世界2026桔宝不过期激活码

游戏迷你世界中,在2026年的今日分享给大家桔宝的不过期激活码,只要使用2026年桔宝的未过期激活码即可免费获得这个角色,想要的玩家可以拿着激活码到游戏中去兑换就可以拥有这个角色啦。 详细答案: XId7d92d10579328154e6f 点击查看迷你世界2026不过期激活码汇总 本文内容来源于互联网,如有侵权请联系删除。

迷你世界2026零序不过期激活码

游戏迷你世界中,在2026年的今日分享给大家零序的不过期激活码,只要使用2026年零序的未过期激活码即可免费获得这个角色,想要的玩家可以拿着激活码到游戏中去兑换就可以拥有这个角色啦。 详细答案: ON53293110616819a350cd 点击查看迷你世界2026不过期激活码汇总 本文内容来源于互联网,如有侵权请联系删除。

日本 15 岁少年侵入万代南梦宫流媒体平台,利用 ChatGPT 编写自动化脚本注销 4 万余名用户账号

7 月 6 日消息,据日媒 TBS 报道,日本一名 15 岁少年因入侵万代南梦宫旗下动画流媒体平台“万代频道(バンダイチャンネル)”服务器、注销数万名用户账号,近日被警方逮捕。参考报道获悉,涉案人为居住在埼玉县所泽市的一名 15 岁高中一年级学生。其在 2025 年 11 月利用他人会员账号侵入万代频道服务器,批量注销平台 46812 名会员账号,导致运营方 Bandai Namco Filmwo...

压缩软件 WinRAR 发布 7.23 版本,修复内存溢出与路径遍历两项安全漏洞

感谢网友 Coje_He 的线索投递! 7 月 2 日消息,WinRAR 现已发布 7.23 新版更新,主要修复了两项安全漏洞,分别涉及内存安全问题以及符号链接(Symbolic Link)处理机制缺陷,影响范围涵盖 WinRAR 本体及其相关组件 RAR 和 UnRAR。官方建议用户尽快升级,以降低潜在风险。注意到,这次修复的两项漏洞目前尚未分配 CVE 编号,也没有公布 CVSS 严重性评分,...

小米米家冰箱推送 OTA 升级:新增临期 / 过期提醒、低温食材预处理模式等

感谢网友 顺势而为 的线索投递! 6 月 27 日消息,小米集团大家电部总经理单联瑜宣布,米家冰箱 OTA 升级今天起陆续推送。整理如下:升级「食材管理」新增语音录入自定义食材:支持米家 App 内语音添加食材可识别食材名称、储存位置、存储期新增手动录入自定义食材:支持米家 App 内手动添加自定义食材支持添加图片、名称、储存位置、存储期新增食材状态可视化:基于食材存储周期,以颜色区分最佳赏味期、...