从特定文件读取python中的文件

从特定文件读取python中的文件,python,Python,我有一个很大的日志文件,我想从这个日志中读取相关部分 每个部分都以######开始日志####开头,因此我需要搜索最后一次出现的##开始日志###,并阅读这些行,直到文件结束 我看到一个解决方案,它可以通过seek(数字)搜索一行,但我不知道,我只知道该行的内容 对于这种情况,最好的解决方案是什么?我建议将文件向后读取,直到第一次出现start标记。 with open(filename) as handle: text = handle.read() lines = text.spli

我有一个很大的日志文件,我想从这个日志中读取相关部分

每个部分都以
######开始日志####
开头,因此我需要搜索最后一次出现的
##开始日志###
,并阅读这些行,直到文件结束

我看到一个解决方案,它可以通过seek(数字)搜索一行,但我不知道,我只知道该行的内容


对于这种情况,最好的解决方案是什么?

我建议将文件向后读取,直到第一次出现start标记。
with open(filename) as handle:
    text = handle.read()
lines = text.splitlines()
lines.reverse()
i = next(i for i, line in enumerate(lines) if line == '###start log###')
relevant_lines = lines[:i]
relevant_lines.reverse()
您可以通过以下两种方式之一执行此操作:如果文件适合内存,请尝试以下操作:

如果文件太大-您可能会发现此链接很有用:

考虑到文件的大小,您基本上需要以相反的顺序读取文件。在python上有一些帖子;如果您在unix系统上,还可以查看unix命令,然后通过管道读取输出,并在点击日志开头时停止:

>>> from subprocess import PIPE, Popen
>>> from itertools import takewhile
>>> with Popen(['tac', 'tmp.txt'], stdout=PIPE) as proc:
...     iter = takewhile(lambda line: line != b'###start log###\n', proc.stdout)
...     lines = list(iter)
然后,按正确顺序排列的最后一行日志将是:

>>> list(reversed(lines))

我会说,逐行阅读,跟踪最后一行“###########”开始日志,当遇到EOF时,使用最后一行的索引日志文件。您可以使用块在
中执行
lines=handle.readlines()。。。但从另一方面来说,这是一个更好的解释,你知道我的意思吗?按照编写的方式,读取整个文件,然后迭代文件的所有内容。我想这是两倍的慢,没有任何好处。你可能会在OP中鼓励坏习惯!