2016-04-27 104 views
0

我有一个大的日志有几个命令(结尾)和它们的输出(至END)像下面这样:Python的日志分析器

<blabla; 

foo 
... 
... 

END 

<xyz; 

... 
... 

END 

--and so on 

的要求是与命令名称不同的文件中像

blabla 
xyz 

并且在每个文件中应该是它们各自的输出。

到目前为止,我有:

def generateDicts(log_fh): 
currentDict = {} 
for line in log_fh: 
    if line.endswith(";"): 
     if line.endswith("END"): 
      yield currentDict 
     currentDict = {""} 
    else: 
     currentDict["text"] += line 
yield currentDict 

with open("logfile.txt") as f: 
print list(generateDicts(f)) 

请帮助。

+0

1)你的问题是什么? 2)你的解决方案有什么不足?它是否打印错误?它是否无法正确执行? –

回答

1

你的文章说你需要写入文件,但你的例子没有做任何文件I/O。这是一个打开,关闭和写入文件的程序。

import fileinput 

output = None 
for line in fileinput.input(): 
    line2 = line.strip() 
    if line2.startswith('<'): 
     output = open(line2[1:].split(';')[0], 'w') 
    elif line2 == 'END': 
     output.close() 
     output = None 
    elif output: 
     output.write(line) 
+0

我在哪里放置文件名? – slyclam

+0

你把文件名放在命令行上。将我的程序保存为“parse_log.py”,然后运行以下命令:'python parse_log.py logfilename.log' –

+0

我运行了它。它使用第一个命令名称生成一个空白文件。这是我得到的错误:>蟒蛇parse_log.py test.log中 回溯(最近通话最后一个): 文件 “parse_log.py”,9号线,在 output.close() AttributeError的: 'NoneType' 对象没有属性“关闭” – slyclam

0

您可以使用re模块

import re 
with open('test','r') as f,open('output','w') as f1: 
    f1.write("\n".join(re.findall(r'\<(\w+)\;',f.read()))) 

输出:

blabla 
xyz 

但是,如果文件尺寸过大,则可以考虑从文件中的行读取线,而不是读它作为一个整体。