Форум сайта python.su
0
Добрый день!
Есть лог следующего вида:
69.94.xx.xx - - [03/Jun/2013:04:32:01 +0300]
95.168.xx.xx - - [03/Jun/2013:04:32:0
69.94.xx.xx - - [03/Jun/2013:04:32:01 +0300]
95.168.xx.xx - - [03/Jun/2013:04:32:01 +0300]
176.119.xx.xx - - [03/Jun/2013:04:32:02 +0300]
86.105.xx.xx - - [03/Jun/2013:04:32:02 +0300]
69.94.xx.xx - - [03/Jun/2013:04:32:02 +0300] "
83.172.xx.xx - - [03/Jun/2013:04:32:03 +0300]
91.121.xx.xx - - [03/Jun/2013:04:32:04 +0300]
208.167.xx.xx - - [03/Jun/2013:04:32:04 +0300]
69.94.xx.xx- - [03/Jun/2013:04:32:04 +0300]
91.121.xx.xx - - [03/Jun/2013:04:32:04 +0300]
91.121.xx.xx - - [03/Jun/2013:04:32:04 +0300]
89.161.xx.xx - - [03/Jun/2013:04:32:05 +0300]
69.94.xx.xx - - [03/Jun/2013:04:32:05 +0300]
#!/usr/bin/env python
raw=[(x.split()[0]) for x in open("/home/user/access.log")]
e=0
raw2=[]
for elem in raw:
raw2.append((raw.count(raw[e]),raw[e]))
e+=1
raw2=set(raw2)
raw2=sorted(raw2)
e=0
for elem in raw2:
print (raw2[e])
e+=1
Офлайн
22
sums = {} for i in open("/home/user/access.log"): b=i.split()[0] sums.setdefault(b, 0) sums[b] += 1 print sums
Отредактировано ilnur (Июнь 3, 2013 16:14:48)
Офлайн
33
Такие задачи решаются с помощью БД.
Офлайн
25
А так?
from collections import defaultdict from operator import itemgetter from pprint import pprint def count(a, b): ip = b.split()[0] a[ip] += 1 return a with open('/home/user/access.log') as fd: counter = reduce(count, fd, defaultdict(int)) pprint(sorted(counter.items(), key=itemgetter(1), reverse=True))
Отредактировано s0rg (Июнь 3, 2013 17:36:40)
Офлайн
0
ilnurРаботает ) выплевывает результат на ходу))
s0rgНе работает. Пишет
А так?
Traceback (most recent call last):
File "./split_2.py", line 10, in <module>
counter = reduce(count, data, defaultdict(int))
NameError: name 'data' is not defined
Офлайн
25
dizупс, поправил. Перепроверяйте
Не работает. Пишет
Офлайн
36
from collections import Counter from operator import itemgetter from pprint import pprint with open('/home/user/access.log') as fd: counter = Counter(line.split()[0] for line in fd) pprint(sorted(counter.items(), key=itemgetter(1), reverse=True))
Офлайн
22
diz
А как отсортировать по колличеству запросов?
lsums = sorted(sums.items(), key=lambda x: x[1])
Офлайн
568
ilnur, itemgetter - твой друг, не надо так делать
key=lambda x: x[1]
Офлайн
0
Всем спасибо!
По времени выполнения:
Лог файл 200000 линий.
pyuser 0m0.351s
ilnur 0m0.297s ( вывод идёт в строку)
s0rg 0m0.298s
Теперь буду изучать использованные вами функции.
Офлайн