讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Python中实现类似Unix tail -f命令的实时读取?

老磊姑娘_9831

老磊姑娘_9831

发布时间:2026-06-14 11:35:05

|

936人浏览过

|

来源于php中文网

原创

Python 的 open() 配合循环无法可靠实现 tail -f,因会阻塞、跳行、漏更新及轮转失效;根本原因是文件对象不感知底层变化,而 watchdog 或轮询 + os.stat() 才能正确处理变更、截断与编码问题。

如何在python中实现类似unix tail -f命令的实时读取?

Python 里用 open() 配合循环读取文件末尾,无法可靠实现 tail -f 行为——它会卡住、跳行、漏更新,甚至在文件轮转时彻底失效。

为什么 while True: file.readline() 不行

这种写法看似简单,但实际运行中会遇到三类典型问题:

  • 文件未刷新时,readline() 会阻塞(尤其日志由其他进程写入且未调用 flush())
  • 文件被截断(如 logrotate)后,Python 文件对象仍持旧 inode 句柄,后续读不到新内容
  • 追加写入时若跨块边界(比如一次写入 8KB),readline() 可能拆开一行,导致解析错乱

根本原因是 Python 的 file 对象不感知底层文件变化,只按当前偏移顺序读。Unix tail -f 底层依赖 inotify(Linux)或 kqueue(macOS),并主动处理 ESPIPE、EINVAL 等错误来检测截断。

用 watchdog 库监听文件变更更可靠

它封装了系统级事件通知机制,能捕获创建、修改、移动、删除等动作,适合生产环境长期运行。

立即学习“Python免费学习笔记(深入)”;

Python Use Agent
Python Use Agent

智能执行Python任务,自动生成、执行代码并反馈结果,无需额外配置,兼容旧命令。

下载
  • 安装:pip install watchdog
  • 监听单个日志文件时,需同时响应 FileModifiedEvent 和 FileMovedEvent(后者覆盖轮转场景)
  • 每次事件触发后,应重新打开文件并定位到上次读取位置,避免重复或遗漏
  • 注意:默认不递归子目录,若需监控整个 /var/log/,要显式设 recursive=True
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class TailHandler(FileSystemEventHandler):
    def __init__(self, filepath):
        self.filepath = filepath
        self.offset = 0

    def on_modified(self, event):
        if event.src_path == self.filepath:
            with open(self.filepath, 'rb') as f:
                f.seek(self.offset)
                for line in f:
                    print(line.decode('utf-8', errors='ignore').rstrip('\n'))
                self.offset = f.tell()

轻量方案:手动轮询 + os.stat() 检测文件变化

如果不能引入第三方库,可用轮询模拟,关键在于判断「是否真有新内容」而非盲目读:

  • 每次循环前调用 os.stat(filepath).st_size,与上一次大小比较
  • 若变大,说明有追加,用 seek() 跳到旧 offset 后读取新增部分
  • 若变小(即被截断),重置 offset = 0 并重新打开文件(避免 IOError: Invalid argument)
  • 轮询间隔建议 ≥ 0.1 秒,太短徒增 CPU,太长延迟明显

这个方法不依赖系统事件,兼容性最好,但要注意 st_size 在 NFS 或某些容器挂载路径下可能延迟更新。

别忽略编码和换行符的陷阱

真实日志文件往往混用 \n、\r\n,甚至含非 UTF-8 字节(如 Java 应用输出 GBK 日志):

  • 用 open(..., encoding='utf-8', errors='replace') 比裸 readline() 更鲁棒
  • 逐字节读取(f.read(1))虽能绕过换行符问题,但性能差,仅作调试用
  • 如果日志明确是二进制格式(如 Protobuf 封装),就不要用文本模式打开,直接 read() + 解析协议

真正难的不是“怎么读到新行”,而是“怎么确保每次读都对、不丢、不卡、不崩”——尤其是服务跑一周后,文件轮转了七次,磁盘 IO 波动,编码偶尔错一个字节,这些细节才决定脚本能不能活下来。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1611

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

3924

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1609

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

22537

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2767

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2807

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1123

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn