将日志文件解析为python列表的最佳方法是什么?

时间:2011-07-27 01:46:21

标签: python

我有一个有趣的日志文件格式,我想将其解析为Python进行分析。

格式为key=value,每个格式由制表符分隔,每个条目末尾都有换行符,如下所示:

date="Mon, 04 Jul 2011 05:05:45 GMT"    addr=127.0.0.1  response_time=13    method=GET  url=/   status=200  referrer=   user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30"

现在有些字段可能正在发生变化,所以我希望代码能够灵活处理它所引发的内容,只要它的形式为key=value key=value(等等)

截至目前,我有两个嵌入式for循环,一个用于将每一行拆分为key=value字段,另一个用于将key=value拆分为各自独立的实体。

这看起来是最好的方式还是有更优雅的解决方案?

3 个答案:

答案 0 :(得分:2)

对于这个问题,两个for循环似乎很好。如果我正在编码,我可能会做这样的事情:

with open('log_file') as f:
    for line in f:
        fields = line.split('\t')
        for field in fields:
            key,_,val = field.partition('=')
            # Do something with each key and val

答案 1 :(得分:1)

可能有一个模块来解析日志文件,但一个简单的自制方法就是使用shlex模块:

>>> import shlex
>>> line = """date="Mon, 04 Jul 2011 05:05:45 GMT" addr=127.0.0.1 response_time=13 method=GET url=/ status=200 referrer= user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30" """
# Split key=value pairs.  'value' can contain quoted whitespace.
>>> keyvals = shlex.split(line)
# Separate 'key' and 'gals' for each keyval pair.
>>> data = [x.partition('=')[::2] for x in keyvals]
>>> print data
[('date', 'Mon, 04 Jul 2011 05:05:45 GMT'), ('addr', '127.0.0.1'), ('response_time', '13'), ('method', 'GET'), ('url', '/'), ('status', '200'), ('referrer', ''), ('user_agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30')]
>>> print dict(data)
{'status': '200', 'addr': '127.0.0.1', 'url': '/', 'referrer': '', 'user_agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'date': 'Mon, 04 Jul 2011 05:05:45 GMT', 'method': 'GET', 'response_time': '13'}

答案 2 :(得分:1)

python的csv模块在​​这里工作得很好。 您可以将分隔符设置为选项卡 此示例来自使用空格的文档。

>>> import csv
>>> spamReader = csv.reader(open('eggs.csv', 'rb'), delimiter=' ', quotechar='|')
>>> for row in spamReader:
...     print ', '.join(row)

然后你可以在循环内部检查'='字符并将字符串分开(如果找到键值对。)

result = []    
for row in spamReader:
       if '=' in row:
          s = row.split('=')
          result.append( {s[0]:s[1]} )