Форум сайта python.su
Написал небольшой скрипт для суммирования трафика с разных IP локальной сети, в результате выводиться сумма для всех найденных локальных адресов. А так же для каждого создается файл-отчет с подробной статистикой по серверам, куда лазил клиент. Все работает, хочу услышать можно ли мою программу переписать еще более в pythonic style. Я начинающий питонер, и вообще программист. Еще у меня вопрос по поводу обработки исключений, где почитать про хороший стиль в этом деле. Должна программа выпадать с ошибкой понятной пользователю при исключении или ей стоит продолжать пытаться работать любой ценой?
#!/usr/bin/python
# -*- coding: utf-8 -*-
fl = open('netflow.csv', 'r')
#файл такого вида
#94.100.189.32,443,192.168.10.4,1048,2104
clients = {}
for line in fl:
server, fromport, client, toport, amount = line.split(',')
if client in clients:
if server in clients[client]:
clients[client][server] += int(amount)
else:
clients[client][server] = int(amount)
else:
clients[client] = {}
clients[client][server] = int(amount)
fl.close()
for client in clients:
ofile = open('%s.csv' % client.replace('.','_'), 'w' )
osum = 0
alist = sorted(clients[client].iteritems(), key=lambda (k,v): (v,k), reverse=True)
for i in range(len(alist)):
ofile.write('%s,%d\n' % alist[i] )
osum += alist[i][1]
print client, osum
ofile.close()
Офлайн
for i in alist:
ofile.write('%s,%d\n' % i )
osum += i[1]
Офлайн
использование collections.defaultdict
>>>import collections
>>>d = collections.defaultdict(int)
>>> d[1] += 10
>>> d
defaultdict(<type 'int'>, {1: 10})
Офлайн
Dimka665Спасибо! Буду знать.
использование collections.defaultdict
Офлайн
После некотрых мучений в попытках разобраться с наследованием класса от collections.defaultdict пришел к такому вот лаконичному решению первого цикла
from collections import defaultdict
class mydict(defaultdict):
def __init__(self):
defaultdict.__init__(self, int)
fl = open('netflow.csv', 'r')
clients = defaultdict(mydict)
for line in fl:
server, fromport, client, toport, amount = line.split(',')
clients[client][server] += int(amount)
fl.close()
Офлайн
defaultdict(lambda :defaultdict(int))
прокатило бы
Офлайн
Dimka665Красиво! За это люблю питон.
defaultdict(lambda :defaultdict(int))
прокатило бы
Офлайн
А еще есть стандартный модуль csv , соответственно предназначеный для работы с файлами .csv
Офлайн