You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python监控日志文件新行遇问题:读取新行始终返回空值

解决Python监控日志文件新行的问题

我帮你梳理下问题所在,再给出几种靠谱的实现方式~

你的代码问题分析

你当前的代码每次循环都会重新打开log.txt,这就导致每次都是一个全新的文件句柄——哪怕你记录了where位置,这个位置只对旧的文件句柄有效,新打开的文件默认还是从开头开始,再执行seek(0,2)跳到末尾后,自然读不到任何内容。核心问题就是不要每次循环都重新打开文件,要保持同一个文件句柄来追踪位置。

改进方案1:优化你的原有代码

把文件打开操作放到循环外面,用同一个句柄持续监控:

import time

# 用with语句管理文件,自动处理关闭逻辑
with open("log.txt", "r") as log_file:
    # 先跳到文件末尾,准备监控新内容
    log_file.seek(0, 2)
    while True:
        # 尝试读取新行
        new_line = log_file.readline()
        if not new_line:
            # 没有新内容就等待1秒,避免占用过多CPU
            time.sleep(1)
            continue
        # 这里处理你的业务逻辑
        print(f"捕获新日志: {new_line.strip()}")

这个逻辑的关键是:同一个文件句柄会持续追踪当前读取位置,当外部程序向日志文件追加内容时,readline()就能从上次的位置读到新的行。

改进方案2:用fileinput模块(更简洁)

Python内置的fileinput模块专门处理这种持续读取文件的场景,无需手动管理seek和sleep:

import fileinput

# 监控log.txt,自动追踪新内容
for line in fileinput.input("log.txt", openhook=fileinput.hook_encoded("utf-8")):
    # 处理新行逻辑
    print(f"捕获新日志: {line.strip()}")

fileinput会自动帮你处理文件的持续监控,当文件没有新内容时会阻塞等待,有新内容追加时立即读取,代码更简洁优雅。

内容的提问来源于stack exchange,提问作者Franz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:02:10