我有一个大日志文件,我想从此日志中读取相关部分。
每个部分都以###start log###
开头,因此我需要搜索最后一次出现的###start log###
,然后读取这些行直到文件末尾。
我看到一个可以通过搜索(数字)搜索一行的解决方案,但我不知道,我只知道该行的内容。
此案例的最佳解决方案是什么?
答案 0 :(得分:1)
我建议向后读取文件,直到第一次出现开始标记。 您可以通过以下两种方式之一来完成:如果文件适合内存,请尝试:Read a file in reverse order using python
如果文件太大 - 您可能会发现此链接有用: http://code.activestate.com/recipes/120686-read-a-text-file-backwards/
答案 1 :(得分:1)
鉴于文件的大小,您基本上需要以相反的顺序读取文件。 python中how to read a file in reverse order上有一些帖子;如果您使用的是unix系统,您也可以查看unix tac
命令,然后通过管道读取输出,并在点击日志开头时停止:
>>> 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))
答案 2 :(得分:0)
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()