从Apache日志文件中获取Pandas数据帧

3

我有一个日志文件,其中包含1,770,781行以下形式的内容:

[02/Jan/2015:08:08:43] "GET /click?article_id=139&user_id=19550 HTTP/1.1" 200 3078

我希望你能为我翻译一下以下内容,它与it技术有关。我需要提取时间、文章ID和用户ID,并以方便分析的格式进行组合。目前,我有以下代码,可以提取这些元素并尝试将它们组合在Pandas DataFrame中:
logs = pd.DataFrame(columns=['time', 'article_id', 'user_id'])
regex = '\[(?P<time>.*?)\] "GET (.*?=)(?P<article_id>\d+)(&.*?=)(?P<user_id>\d+)'

for line in log_file:
    time = re.match(regex, line).group('time')
    article_id = re.match(regex, line).group('article_id')
    user_id = re.match(regex, line).group('user_id')
    logs.append([time, article_id, user_id])

但是这个程序运行时间非常长,我开始觉得我应该放弃这种方法。有没有什么办法可以使它更加高效?尝试这样做真的现实吗?如果不是,那么有没有更好的方法来获取这些数据?

1个回答

2

您没有使用re.compile,并且在循环内部进行了三次低效匹配,而一次匹配就足够了。

logs = pd.DataFrame(columns=['time', 'article_id', 'user_id'])
# regc = re.compile(r'\[(?P<time>.*?)\] "GET (.*?=)(?P<article_id>\d+)(&.*?=)(?P<user_id>\d+)')
# alternative regexp that might be more efficient
regc = re.compile(r'\[(?P<time>.+)\] "GET (?:.+article_id=)(?P<article_id>\d+)(?:&user_id=)(?P<user_id>\d+)')

for line in log_file:
    m = regc.match(line)
    time = m.group('time')
    article_id = m.group('article_id')
    user_id = m.group('user_id')
    logs.append([time, article_id, user_id])

在第四行,你的意思是 m=re.match(regc, line) 吗? - user4601931
@dmdmdmdmdmd 那个regex不该在那里,我修改了我的回答。 - J.J. Hakala
好的,非常感谢您的回复。我估计这将需要大约60分钟才能运行。也许有更好的方法吗? - user4601931
@dmdmdmdmdmd 我对pandas没有太多经验。你能排除它导致的减速吗?例如,首先使用logs = [],然后在循环中使用logs.append((time, article_id, user_id)) - J.J. Hakala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接