Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Посчитать кто куда сколько раз отправил по логу почтового сервера. Проверка наличие ключа в словаре не работает

#python #python_3x


Доброго времени суток. Возник вопрос. Есть файл отфильтрованный из лога почтового
сервера:

gpk@site.com  for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com
gpk@site.com  for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com
gpk@site.com  for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com


Ожидаемый результат:

{gpk@site.com
{
16745165214@kdf.net : 3
kglk@mail.ru : 3
kjl@list.ru : 3
ncv@gmail.com : 3
}
}


пишу код: которое должен почитать кто куда сколько раз отправил.

    #! /usr/bin/env python3.6
# -*- coding: utf-8 -*-
def reader(fname):
    d={}
    fromto={}
    df=[]

    file = open(fname,"r")
    for line in file:
#           print (line)
            ll=line.strip().split('for')
            sfrom=''.join(ll[0].split())
            sto=ll[1].split()
            if sfrom in fromto: # почему-то проверка не рботает
                df = fromto[sfrom]

            for i in range(len(sto)):
                    df.append(sto[i])

            fromto[sfrom]= df
            df.clear()

    print(fromto)

if __name__ == '__main__':
    reader('list-100.list')

    


Ответы

Ответ 1



Проще разделять строку не по "for", а сразу по пробелам, и игнорировать второй элемент массива, который содержит "for". Если необходимо еще и посчитать кто кому сколько раз отправил, то можно сделать так: from collections import Counter log = """\ gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com gpk2@site.com for 7167451652142@kdf.net kglk2@mail.ru lkjl2@list.ru ncv2@gmail.com gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com """ pairs = Counter() for line in log.splitlines(): tmp = line.split() from_user = tmp[0] pairs.update((from_user, to_user) for to_user in tmp[2:]) print(pairs) В итоге для каждой пары (Отправитель, Получатель) мы имеем число отправленных сообщений. UPD: При необходимости последующего вывода, сгруппированного по отправителю, можно использовать другой метод: from collections import defaultdict, Counter base = defaultdict(Counter) log = """gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com gpk2@site.com for 7167451652142@kdf.net kglk2@mail.ru lkjl2@list.ru ncv2@gmail.com gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com """ for line in log.splitlines(): tmp = line.split() from_user = tmp[0] base[from_user].update(tmp[2:]) и распечатка будет выглядеть следующим образом: for from_user, msgs in base.items(): print("{0}:".format(from_user)) for to_user, count_messages in msgs.items(): print(" {0}: {1}".format(to_user, count_messages)) Вывод консоли: gpk@site.com: 716745165214@kdf.net: 2 kglk@mail.ru: 2 lkjl@list.ru: 2 ncv@gmail.com: 2 gpk2@site.com: 7167451652142@kdf.net: 1 kglk2@mail.ru: 1 lkjl2@list.ru: 1 ncv2@gmail.com: 1

Ответ 2



text = """\ 1. gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com 2. abc@site.com for site@site.ru lkjl@list.com """ from collections import defaultdict from_by_to_list = defaultdict(list) for line in text.splitlines(): line = line.strip() from_str, to_str = line.split('for') from_str = from_str.strip().split()[1] to_list = to_str.strip().split() from_by_to_list[from_str] += to_list print(from_by_to_list) print() for k, items in from_by_to_list.items(): print('{} ({}):'.format(k, len(items))) for i, x in enumerate(items, 1): print(' {}. {}'.format(i, x)) print() Консоль: defaultdict(, {'gpk@site.com': ['716745165214@kdf.net', 'kglk@mail.ru', 'lkjl@list.ru', 'ncv@gmail.com'], 'abc@site.com': ['site@site.ru', 'lkjl@list.com']}) gpk@site.com (4): 1. 716745165214@kdf.net 2. kglk@mail.ru 3. lkjl@list.ru 4. ncv@gmail.com abc@site.com (2): 1. site@site.ru 2. lkjl@list.com

Комментариев нет:

Отправить комментарий