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

Python检测文件修改仅打印最新新增行的代码调试求助

问题根源

原有代码的行判定逻辑存在缺陷:

  • 使用line not in before判断是否为新行时,只要新增行的内容和过往历史行重复,就会被误判为旧内容漏检
  • 如果文件发生非追加类修改(比如插入行、删除行、调整行顺序),所有位置变动的旧行都会被误判为新行输出,这就是你会同时看到倒数第二行和最后一行输出的核心原因
  • 原代码把sendembed()放在逐行遍历的循环内,一旦检测到多行变更会重复触发Discord webhook推送,不符合预期。
修复代码

如果你的使用场景是监控日志类文件(默认修改方式为末尾追加内容),不需要逐行做存在性判断,直接通过两次读取的行长度差取新增内容即可,如果你仅需要最新新增的最后一行,直接取新增段的末尾元素就行:

import time

def readfile():
    with open("test.txt", "r", encoding="utf-8") as t:
        return t.readlines()

before = readfile()
while True:
    after = readfile()
    line_count_diff = len(after) - len(before)
    if line_count_diff > 0:
        # 直接取当前文件最后一行即为最新新增内容
        latest_line = after[-1].strip()
        print(latest_line)
        # 传入最新行内容到推送函数,仅调用一次
        sendembed(latest_line)
        before = after
    # 增加短休眠,避免死循环持续读文件占满CPU
    time.sleep(0.5)
兼容非追加修改的简化方案

如果你需要兼容文件中间插入、删除内容的场景,可以直接记录上一次读取的文件最后一行,每次只对比最后一行的内容变化即可:

import time

def readfile():
    with open("test.txt", "r", encoding="utf-8") as t:
        return t.readlines()

# 初始化记录上一次的最后一行,兼容空文件场景
all_lines = readfile()
before_last = all_lines[-1] if all_lines else ""
while True:
    current_lines = readfile()
    current_last = current_lines[-1] if current_lines else ""
    if current_last != before_last:
        latest_line = current_last.strip()
        print(latest_line)
        sendembed(latest_line)
        before_last = current_last
    time.sleep(0.5)

注意:读取文件时建议显式指定文件编码,避免不同系统下默认编码不一致导致的读取报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:06:26