我正在尝试计算每台网络服务器的点击次数 日历月(12月,1月,2月,...)按年份。
我是Python的新手,所以我甚至不知道从哪里开始。我想你必须使用一些字符串拆分或正则表达式。
我获得了一个包含以下输出的日志文件:
[31/Dec/1994:23:55:08 -0700] "GET 45.html HTTP/1.0" 200 5489
remote - - [31/Dec/1994:23:56:55 -0700] "GET 2195.ps HTTP/1.0" 200 522318
remote - - [31/Dec/1994:23:59:37 -0700] "GET 957.ps HTTP/1.0" 200 122146
remote - - [01/Jan/1995:00:31:54 -0700] "GET index.html HTTP/1.0" 200 2797
remote - - [01/Jan/1995:00:31:58 -0700] "GET 2.gif HTTP/1.0" 200 2555
remote - - [01/Jan/1995:00:32:33 -0700] "GET 3.gif HTTP/1.0" 200 36403
remote - - [01/Jan/1995:01:39:21 -0700] "GET 20.html HTTP/1.0" 200 378
local - - [01/Jan/1995:01:47:41 -0700] "GET index.html HTTP/1.0" 200 2797
local - - [01/Jan/1995:01:47:49 -0700] "GET 39.html HTTP/1.0" 200 669
local - -
答案 0 :(得分:0)
分割比应用正则表达式更容易(IMO)。您可以通过传入日志行来使用以下函数提取这些值:
def year_month(s):
try:
discard, month, rest = s.split('/', 2) # split twice on '/'
except ValueError:
return None # for last line without /
year = rest.split(':', 1)[0]
year = int(year) # optional
return year, month
您可以使用此函数返回的元组作为某些字典的键:
d = {}
for line in open('yourfile'):
ym = year_month(line)
if ym is None:
continue
x = d.setdefault(ym, [0])
x[0] += 1
for ym in sorted(d):
print('Year: {0}, Month: {1}, Hits: {2}'.format(ym[0], ym[1], d[ym][0]))
如果您想使用正则表达式,可以将year_month()
部分替换为:
import re
# see https://docs.python.org/2/howto/regex.html
year_month_pattern = re.compile(r"""
.*/
(?P<month>.*)
/
(?P<year>\d*)
:.*
""", re.VERBOSE)
def year_month(s):
res = year_month_pattern.match(s)
if res is None:
return None
try:
return int(res.group('year')), res.group('month')
except ValueError:
pass