Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将日志文件解析为python列表的最佳方法是什么?_Python - Fatal编程技术网

将日志文件解析为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

我有一个有趣的日志文件格式,我想把它解析成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
拆分为各自独立的实体


这似乎是最好的方法还是有更优雅的解决方案?

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倍左右!非常感谢!