我目前正在使用 pyinotify 来监视 irssi(用于 linux 命令行的 irc 客户端)日志文件,并且该日志文件是 irssi 使用 pyinotify 的 IN_MODIFY 掩码写入的,它读取文件就好了,并且每次都被告知它改变了,但我试图在一行中找到一个特定的短语,在这一行中,这个短语是:
COMPLETE:
现在我有代码可以检查最后一行是否存在,但是 irssi 有时会以块的形式写入日志文件,因为由于它是机器人读数,所以事情会同时出现。这段代码工作正常,我遇到的问题是找到最接近底部的最后一行,其中包含 COMPLETE: 短语。
我知道我可能做错了,但我想出的方法(它不起作用,所以我做错了)是保存最后一个 COMPLETE: 行并搜索该行并 for loop enumerate在具有行号偏移量的文件上找到最后一行,然后处理每个完整的行。以下是代码,如果有人有任何想法,或者可能有更好的方法,将不胜感激!
def getlastline(self):
logfile = "/home/user/irclogs/kta/#kta-all.log"
with open(logfile, "rb") as f:
if self.lastline != "":
#This part doesn't work.
thenum = 0
for num, line in enumerate(f, 1):
if line == self.lastline:
thenum = num
if thenum == 0:
return
for i, ln in enumerate(f, thenum):
if ln.find("COMPLETE:") > 0:
self.setlast(ln)
self.extractdata(ln)
return
else:
#This part here works
first = f.readline()
f.seek(-2, 2)
while f.read(1) != "\n":
f.seek(-2, 1)
last = f.readline()
if last.find("COMPLETE:") > 0:
self.setlast(last)
self.extractdata(last)
else:
#This part doesn't work
for line in reversed(f.readlines()):
if line.find("COMPLETE:") > 0:
self.setlast(line)
return
编辑:
self.extractdata 是一个函数,用于对我得到的行的某些部分进行正则表达式,该行从 getlastline 函数发送到 self.extractdata,而 self.setlast 仅设置 self.lastline 并打印一些用于测试的东西。
def __init__(self):
self.lastline = ""
def setlast(self, line):
self.lastline = line
print "Next-Newest complete line found."