用Python将weblog文件作为CSV处理

2024-09-30 02:28:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python3csv读取器将一些web日志文件读入一个namedtuple。 我无法控制日志文件的结构,并且有各种类型。你知道吗

分隔符是一个空格(),问题是某些日志文件格式在时间戳中放置了一个空格,如下面的日志文件2。然后,CSV读取器将日期/时间戳作为两个字段读取。你知道吗

日志文件1

73 58 2993 [22/Jul/2016:06:51:06.299] 2[2] "GET /example HTTP/1.1"
13 58 224 [22/Jul/2016:06:51:06.399] 2[2] "GET /example HTTP/1.1"

日志文件2

13 58 224 [22/Jul/2016:06:51:06 +0000] 2[2] "GET /test HTTP/1.1"
153 38 224 [22/Jul/2016:06:51:07 +0000] 2[2] "GET /test HTTP/1.1"

日志文件的时间戳通常用方引号括起来,但我找不到将它们作为“引号”处理的方法。除此之外,方括号也不总是用作日志中的引号(请参阅日志后面的[2])。你知道吗

我已经通读了Python 3 CSV Reader documentation,包括关于方言的内容,但是似乎没有任何东西可以处理括在方括号中的内容。你知道吗

我怎样才能自动处理这种情况?你知道吗


Tags: 文件csvtestwebhttp内容getexample
1条回答
网友
1楼 · 发布于 2024-09-30 02:28:11

这样就可以了,您需要使用正则表达式来代替sep。
例如,此示例将NGinx日志文件解析为pandas.Dataframe

import pandas as pd

df = pd.read_csv(log_file,
              sep=r'\s(?=(?:[^"]*"[^"]*")*[^"]*$)(?![^\[]*\])',
              engine='python',
              usecols=[0, 3, 4, 5, 6, 7, 8],
              names=['ip', 'time', 'request', 'status', 'size', 'referer', 'user_agent'],
              na_values='-',
              header=None
                )

编辑:

line = '172.16.0.3 - - [25/Sep/2002:14:04:19 +0200] "GET / HTTP/1.1" 401 - "" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020827"'
regex = '([(\d\.)]+) - - \[(.*?)\] "(.*?)" (\d+) - "(.*?)" "(.*?)"'

import re
print re.match(regex, line).groups()

输出将是一个包含6条信息的元组

('172.16.0.3', '25/Sep/2002:14:04:19 +0200', 'GET / HTTP/1.1', '401', '', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020827')

相关问题 更多 >

    热门问题