Лучший способ следить за последней строкой, прочитанной в текстовом файле - PullRequest
1 голос
/ 07 февраля 2012

Я разрабатываю демон, который будет непрерывно читать строки из одного текстового файла и обрабатывать эти строки.Каков хороший универсальный способ отслеживать последнюю обработанную строку независимо от имени файла, если строки записываются в текстовый файл, когда демон не запущен?

Время от времени, файл архивируется и на его месте создается новый пустой файл.Демон будет остановлен для архивирования.

Моя первая идея, которая кажется слишком сложной, состоит в том, чтобы вычислить и сохранить хэш и номер строки последней успешно обработанной записи.Затем, когда демон снова запустится, перейдите к этому номеру строки и вычислите хэш.Если хеш совпадает, продолжайте обработку следующей записи.Если хеш не совпадает, начните сначала с файла, так как это скажет, что это новый файл.

У меня такое ощущение, что есть хороший метод общего назначения, используемый анализаторами файлов журнала иличто-то в учебнике, с которым я не сталкивался.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Предполагая, что у вас есть разрешение, достаточно места на диске и вы безопасно убиваете демона ... Просто запишите последнюю строку, обработанную в файл (после завершения работы демона).

Вы можете обернуть каждый экземпляр демона в контекстный менеджер, если хотите

из contextlib import contextmanager

http://docs.python.org/library/contextlib.html

class a_daemon():
    def __init__(self,last_line):
        print "initilizing.."
        self.last_line=last_line

    def run_me(self):
        print "running.."
        #while true, process lines, set last_line to current line being processesed.
        self.last_line='blah'

from contextlib import contextmanager

@contextmanager
def run_new_daemon():
    print "getting last line"
    last_line=open("last_line.txt").read() #you should get a "file does not exist" error the first time running this unless you created the file already

    my_daemon=a_daemon(last_line)
    yield my_daemon

    print "shutting down, writing last line to file."
    with open("last_line.txt",'w') as last_line_file:
        last_line_file.write(my_daemon.last_line)

with run_new_daemon() as my_daemon:
    my_daemon.run_me()
0 голосов
/ 07 февраля 2012

Если вы собираетесь заняться хранением хеша, вы можете также сохранить всю строку. Это не может быть так долго. Или в любом случае, если это достаточно долго, чтобы быть проблемой, то это должны быть действительно огромные файлы !!

В любом случае, вам нужно какое-то сохранение данных. Pickle, JSON, SQLite - все варианты, но в этом случае они кажутся излишними. Я бы просто сохранил его в файле.

...