Python Search irc файл журнала для последней строки с фразой COMPLETE:

В настоящее время я использую pyinotify для отслеживания файла журнала irssi (клиент irc для командной строки linux), и этот файл журнала записывается irssi с использованием маски IN_MODIFY из pyinotify, он читает файл очень хорошо и ему сообщают каждый раз, когда его изменили, но я пытаюсь найти конкретную фразу в строке, в этой строке фраза:

COMPLETE:

Теперь у меня есть код, который проверяет последнюю строку, чтобы увидеть, есть ли она там, но irssi иногда записывает в файл журнала кусками, потому что все приходит сразу, потому что это считывание бота. Этот код работает нормально, но у меня проблемы с поиском последней строки, ближайшей к нижней части с фразой "ЗАВЕРШЕНО:".

Я знаю, что, вероятно, я делаю это неправильно, но способ, которым я пришел (и он не работает, поэтому я делаю это неправильно), состоит в том, чтобы сохранить последнюю строку COMPLETE: и найти эту строку и перечислить цикл над файлом со смещением номера строки, в котором находится последняя строка, и обрабатывайте каждую полную строку после этого. Ниже приведен код, если у кого-то есть какие-либо идеи или, возможно, лучший способ сделать это, это будет с благодарностью!

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 - это функция для регулярного выражения определенных частей получаемой строки, строка отправляется в self.extractdata из функции getlastline, а self.setlast просто устанавливает self.lastline и печатает что-то для тестирования.

def __init__(self):
        self.lastline = ""

def setlast(self, line):
        self.lastline = line
        print "Next-Newest complete line found."

0 ответов

Другие вопросы по тегам