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
相关产品推荐
相关产品推荐

