【数据处理】[python]提取某巨量文本中关键词及前N行字符串

背景

之前的程序生成了300w行的日志,bug的地方有“error”字样,其他部分皆为正常日志,不用管,想看看error前面都发生了啥事,然而人眼硬看300w,即使有ctrl+f也很麻烦,于是打算写个程序,自动提取出崩溃的上面5行日志信息。
比如

start
init
running
running 
working 
deleting
error
start
init
error

想提取成

init
running
running 
working 
deleting
error
start
init
error

程序代码

def get_lines(file):
    for line in file:
        yield line


def extract_lines(input_file, output_file, window_size, markword):
    window = []
    for line in get_lines(input_file):
        window.append(line)
        if (len(window) > window_size):
            window = window[1:]
        if markword in line:
            for l in window:
                output_file.write(l)
            window = []


with open('log.txt', 'r', encoding='UTF-8') as input_file, open('output.txt', 'w',
                                                                         encoding='UTF-8') as output_file:
    extract_lines(input_file, output_file, 5, 'error')

运行结果

在这里插入图片描述
左图是输入,右图输出 可以看到能正确完成任务。

注意事项和解释

  • 你的文本用的什么编码自己在源代码处改,想提取多少行就把5改成几。
  • 只要是文本行内有输出关键字(markword)就行,比如上面的例子,如果有一行是running with error xxx ,这行包括了error关键字,他以及上面几行也会被输出。
  • 程序能跑大文件,因为用了yield关键字来流式处理文本,不会一次性读入所以数据。(300w行日志有3个g,这里就不放图了)
  • n行内容正序输出用的是滑动窗口的思想,详情请自行谷歌或读代码。

猜你喜欢

转载自blog.csdn.net/gongfpp/article/details/128631483