跟踪文本文件中读取的最后一行的最佳方法

时间:2012-02-07 02:50:10

标签: python linux text daemon

我正在设计一个守护程序,它将连续读取单个文本文件中的行并处理这些行。如果在守护程序没有运行的情况下将行写入文本文件时,有什么好的通用方法来跟踪处理的最后一行,与文件名无关?

每隔一段时间,文件就会被归档,并在其位置创建一个新的空白文件。守护程序将被停止以便存档。

我的第一个想法,似乎过于复杂,是计算和存储上次成功处理的记录的哈希和行号。然后,当再次启动守护程序时,运行该行号并计算哈希值。如果哈希匹配,则继续处理下一条记录。如果哈希不匹配,请在开头重新开始,因为这会说这是一个新文件。

我觉得日志文件分析器使用了一种很好的通用技术或者我没有接触过的教科书中的东西。

3 个答案:

答案 0 :(得分:0)

如果你要省去存储哈希的麻烦,你也可以存储整行。它不可能那么久。或者在任何情况下,如果问题足够长,那么这些文件肯定是巨大的!!

无论如何,你需要某种数据持久性。 Pickle,JSON,SQLite都是选项,但在这种情况下它们看起来都有些过分。我只是将它存储在一个文件中。

答案 1 :(得分:0)

假设你有权限,足够的磁盘空间并假设你安全地杀死守护进程...... 只需将处理完的最后一行写入文件(关闭守护程序时)。

如果需要,可以将守护程序的每个实例包装在上下文管理器中

来自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()

答案 2 :(得分:0)

我将使用更简单的方法。保存当前文件位置和创建时间。如果创建时间增加,则为新文件。否则从保存的位置开始。

假设仅添加行或​​替换文件。

更偏执的策略是将整个文件哈希到保存的偏移量以查看它是否发生了变化。