2017-02-14 9 views
-1

Я занимаюсь анализом файлов журнала, которые я получаю из своей сети доставки контента. Я дошел до того, что могу выделить одну часть файла журнала, и именно это IP-адрес получил доступ к нашему сайту. То, что я хочу достичь здесь, - это список из 10 самых популярных IP-адресов из большого списка каждого IP-адреса. Некоторые примеры данные я получаю, когда я печатаю этот список выглядит следующим образом:Группировка «похожих значений» из списка

192.168.1.1 
192.168.1.1 
192.168.1.1 
192.168.1.1 
192.168.1.1 
192.168.1.2 
192.168.1.2 
192.168.1.2 
192.168.1.2 
192.168.1.1 
192.168.1.1 
192.168.1.1 

Это не реальный IP-адреса, которые я получаю от выхода, и есть еще много. Как вы можете видеть, они не сгруппированы. Как мне сделать что-то подобное?

Edit: Вот мой код

import gzip 
from collections import Counter 
logFileName = open('C:\\Users\\Pawlaczykm\\Desktop\\fileNames.txt', 'r') 
for line in logFileName.readlines(): 
    print 'Summary of: ' + line 
    # use gzip to decompress the file 
    with gzip.open('C:\\Users\\Pawlaczykm\\Desktop\\' + line.rstrip() + '.gz', 'rb') as f: 
    for eachLine in f: 
     parts = eachLine.split('\t') 
     if len(parts) > 1: 
      ipAdd = parts[2] 
      c = Counter(ipAdd.splitlines()) 
      print(c.most_common(10)) 
+1

'sort' список, и использовать' itertools.groupby', если вы на самом деле хотите, чтобы они сгруппированы вместе –

+0

что-то вроде этого: HTTP : //stackoverflow.com/q/5695208 –

ответ

1

Вы можете использовать collections.Counter для этого:

s = """192.168.1.1 
192.168.1.1 
192.168.1.1 
192.168.1.1 
192.168.1.1 
192.168.1.2 
192.168.1.2 
192.168.1.2 
192.168.1.2 
192.168.1.1 
192.168.1.1 
192.168.1.1""" 

from collections import Counter 
c = Counter(s.splitlines()) 

Теперь вы можете получить 10 самых общих адресов, то есть топ-10-списка:

print(c.most_common(10)) 

Выход:

[('192.168.1.1', 8), ('192.168.1.2', 4)] 

Это список адресов с их подсчетами.

В вашем случае, вы должны дать счетчик все адреса:

addresses = [] 
for eachLine in f: 
    parts = eachLine.split('\t') 
    if len(parts) > 1: 
     ipAdd = parts[2] 
     addresses.append(ipAdd.strip()) 
c = Counter(addresses) 
print(c.most_common(10)) 
+0

Я попытался сделать это, но все, что он сделал, это добавить 1 в конце каждой записи. На самом деле это не группировало их или не подсчитывало, сколько из них было в каждой записи. – mattp341

+0

Все ли записи разные? –

+0

Некоторые из них, но я получаю тот же результат, что и раньше, я применял то, что вы предлагали, за исключением того, что «1» добавлено в конец каждой записи. – mattp341

 Смежные вопросы

  • Нет связанных вопросов^_^