Найти - Пользователи
Полная версия: покритикуйте программу
Начало » Python для новичков » покритикуйте программу
1
Юрчек
Написал небольшой скрипт для суммирования трафика с разных 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()
Dimka665
    for i in alist:
ofile.write('%s,%d\n' % i )
osum += i[1]
Dimka665
использование 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()
Dimka665
defaultdict(lambda :defaultdict(int))
прокатило бы
Юрчек
Dimka665
defaultdict(lambda :defaultdict(int))
прокатило бы
Красиво! За это люблю питон.
alex312
А еще есть стандартный модуль csv , соответственно предназначеный для работы с файлами .csv
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB