gpt4 book ai didi

python - 连续读取python中日志文件的最后一行

转载 作者:行者123 更新时间:2023-12-04 13:53:28 25 4
gpt4 key购买 nike

我有一个文件,其中不断写入新行。
在python中,我想不断读取这个文件的最后一行,以便我可以处理该行。
我知道有 readlines()功能,但这是“静态的”。如果在我调用 readlines() 后添加新行不会读取这些新行。
我怎样才能在 python 中做到这一点?
谢谢

最佳答案

您将需要使用“状态机”。这只是一种奇特的说法,您想跟踪您在文件中的位置,所以您 amy seek()到那个位置,read()到文件末尾,每次遇到换行符时都会读取并前进当前位置。
你可以使用这样的东西,它也可以像迭代器一样使用:

import time


class LogFollower:
def __init__(self, fp):
self.position = 0
self.fp = fp

def seek(self):
self.fp.seek(self.position)

def has(self):
self.seek()
return '\n' in self.fp.read()

def __iter__(self):
while self.has():
self.seek()
line = self.fp.read().split('\n')[0]
yield line

# advance position - this is the 'state machine' part!
self.position += len(line) + 1

follow = LogFollower(open("my_file.txt"))

# assume the file already has 2 lines

for line in follow:
print(line)

#>foo
#>bar

time.sleep(5)

# now suppose a line 'baz' is added to the bottom
# somewhere during those 10 secs, then you decide
# to iterate again.

for line in follow:
print(line)

#>baz

您还可以通过再次迭代来不断检查新行,如上面的假设示例所示,当 baz 时附加。
请注意,这样一来,每一行都必须 结束 带有换行符 ( \n )。这让事情变得更简单,我想这可能就是为什么它是通常的惯例。
这个例子比简单的 readline 需要更多的实践方法。循环如 this one .我认为这种方式需要更多的行数。但是,我认为出于说明目的,它更清晰;我认为它在用简单的面向对象编程解释任务的基础方面做得足够好。
附言我大概打了电话 seek比我真正需要的多几次。例如,我可以不在 has() 中调用它函数,每次运行后 for__next__ 中循环.不过,为了说明清楚,我决定保持这种方式。 :)
P.P.S.我知道这并不是真正的状态机。我的意思是在非常广泛的意义上。实际的有限状态机是一个完全不同的概念。所有这一切都是在每次遇到新行时增加一个计数器。我希望它不会太具有误导性,而且我试图提出的实际观点仍然很清楚——保持跟踪。

关于python - 连续读取python中日志文件的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66771254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com