将日志文件解析为python列表的最佳方法是什么?
我有一个有趣的日志文件格式,我想把它解析成Python进行分析 格式为将日志文件解析为python列表的最佳方法是什么?,python,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
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
拆分为各自独立的实体
这似乎是最好的方法还是有更优雅的解决方案?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
两个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
可能有一个模块可以解析日志文件,但一个简单的自制方法是使用该模块:
可能有一个模块可以解析日志文件,但一个简单的自制方法是使用该模块:
python模块在这里工作得很好。
可以将分隔符设置为选项卡
此示例来自使用空格的文档
>>> 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]} )
python模块在这里工作得很好。
可以将分隔符设置为选项卡
此示例来自使用空格的文档
>>> 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]} )
这看起来很棒。我不知道shlex模块。有什么限制吗?@sdk900:shlex
很好,因为它可以处理引号等,所以它可以正确地解析date=“Mon,…”
,例如,即使字段是用空格而不是制表符分隔的。这看起来很棒。我不知道shlex模块。有什么限制吗?@sdk900:shlex
很好,因为它可以处理引号等,所以它可以正确地解析date=“Mon,…”
,例如,即使字段是用空格而不是制表符分隔的。您需要小心地将其拆分,例如,您应该检查哪些字符可以作为url或引用的一部分出现,并且它们不会干扰您的拆分方法。您需要小心拆分这些字符-例如,您应该检查哪些字符可以作为url或引用的一部分出现,并且它们不会干扰您的拆分方法[(k,v)对于k,u,v in(f.partition('=')对于f-in-line.split('\t'))]
?似乎在一行中做了同样的事情。[(k,v)对于k,u,v in(f.partition('=')对于f-in-line.split('\t'))有什么错
?似乎在同一行中完成了相同的操作。wooot!csv比shlex快10倍左右!非常感谢!wooot!csv比shlex快10倍左右!非常感谢!