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

1 投票
2 回答
1306 浏览
提问于 2025-04-17 12:28

我正在设计一个后台程序,它会不断地从一个文本文件中读取行并处理这些行。有没有什么好的方法可以记录最后处理的行,而不管文件名是什么?这样即使在后台程序不运行的时候,文件中有新行被写入也没关系。

这个文件会定期被归档,然后会创建一个新的空文件来替代它。在归档的时候,后台程序会被停止。

我最初的想法是计算并保存最后成功处理的记录的哈希值和行号。然后,当后台程序再次启动时,先跳到那个行号,计算哈希值。如果哈希值匹配,就继续处理下一条记录。如果哈希值不匹配,那就从头开始处理文件,因为这说明这是一个新文件。

我觉得应该有一种通用的方法,可能是日志文件分析工具使用的,或者是某本教科书里提到的,但我还没有接触过。

2 个回答

0

如果你已经决定要存储一个哈希值,那不如直接把整行内容存起来。其实也没那么长。要是它真的很长,那这些文件肯定得非常大才行!!

总之,你需要某种方式来保存数据。可以用 Pickle、JSON 或 SQLite,这些都是选择,但在这种情况下感觉都太复杂了。我建议直接把它存到一个文件里就行。

0

假设你有权限、足够的磁盘空间,并且安全地关闭了守护进程……

在守护进程关闭时,把最后处理的那一行写入一个文件。

如果你想的话,可以把每个守护进程的实例放在一个上下文管理器里。

可以使用下面的代码来实现这个功能:

来自 contextlib 的上下文管理器

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

撰写回答