我是Python编程的新手,我正在创建一个Apache日志解析器。我发现了一个来自"导入集合"的Counter函数。我正在努力减少线路数量,因为目前我正在计算我的IP发生次数,如下所示:
if sort == 'ip':
ip_count = []
for match in ip_list:
count = 0
for ip_match in ip:
if match == ip_match:
count += 1
ip_count.append(count)
我的字节是这样的:
if desired_output == 'bytes':
cnt_bytes = []
for v in range(len(ip_list)):
tmp = 0
for k in range(len(ip)):
if ip_list[v] == ip[k]:
if bytes[k] == '-':
bytes[k] = 0
tmp += int(bytes[k])
cnt_bytes.append(tmp)
这似乎不符合逻辑。
ip_list[]是唯一ip地址的列表。ip_count[]存储每个ip地址的计数。
有没有办法用Counter((函数减少这些代码行?
您可以使用Counter
:
from collections import Counter
with open('access.log') as fp:
ips = []
for row in fp:
ips.append(row.split(maxsplit=1)[0])
counter = Counter(ips)
或defaultdict
:
from collections import defaultdict
with open('access.log') as fp:
counter = defaultdict(int)
for row in fp:
counter[row.split(maxsplit=1)[0]] += 1