Python /读取日志文件中的特定部分

时间:2014-11-20 13:59:05

标签: python

我在python中有一个.log文件。例如:

**** start logging ****
line 1
line 2
line 3
**** end logging ****
**** start logging ****
line 4
line 5
line 6
**** end logging ****

我想只读取并打印此文件的最后一次记录(写入**** start logging ****时)。在我们的案例中:

**** start logging ****
line 4
line 5
line 6
**** end logging ****

据我所知。 python中的.read().seek()函数应该足以完成此任务。但正如我所见,seek()只能获得偏移,而不是字符串变量。

如何只在此.log文件中使用特定部分?

4 个答案:

答案 0 :(得分:2)

您可以使用str.split

<强>演示

>>> content = '''**** start logging ****
... line 1
... line 2
... line 3
... **** end logging ****
... **** start logging ****
... line 4
... line 5
... line 6
... **** end logging ****'''
>>> ''.join(content.split('**** start logging ****')).replace('**** end logging ****','')
'\nline 1\nline 2\nline 3\n\n\nline 4\nline 5\nline 6\n'

答案 1 :(得分:1)

您只需要使用**** start logging ****拆分文件,然后再将其添加到拆分列表的最后一个元素中!

with open('new.txt' ,'r') as f :
    lines=f.read()
    print "**** start logging ****"+ lines.split("**** start logging ****")[-1]

结果:

**** start logging ****
line 4
line 5
line 6
**** end logging ****

答案 2 :(得分:0)

您需要解析整个文件。

with open(logfile) as f:
    for line in f:
        if line.startswith('**** start logging'):
            l = []
        else:
            l.append(line)
print('\n'.join(l[:-1]))

l中的最后一个条目是end logging行,所以我明确删除了它。

或者,您可以使用file.seek(n, -2),其中n是每个记录记录的字符数的猜测,但是您仍然需要执行一些迭代来获取整个记录,并检查只有一个短语的实例&#39;开始记录&#39;在其中,这意味着你无论如何都要执行上面的代码......

答案 3 :(得分:0)

你说的是读和寻,所以我想你不想在记忆中保留一大堆线。您可以简单地存储上次记录开始的位置并在那里回放:

with open(logfile) as fd:
    last_log_start = None
    while True:
        line = fd.readline()
        if line is None: break
        if line.startswith('**** start logging'):
            last_log_start = fd.tell()
    if last_log_start is not None:
        fd.seek(last_log_start)
        while True:
            line = fd.readline()
            if line is None: break
            if line.startswith('**** end logging'): break
            sys.stdout.write(line)