Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 11, 2009 12:00:26

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

покритикуйте программу

Написал небольшой скрипт для суммирования трафика с разных 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()



Офлайн

#2 Ноя. 11, 2009 12:23:47

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

покритикуйте программу

    for i in alist:
ofile.write('%s,%d\n' % i )
osum += i[1]



Офлайн

#3 Ноя. 11, 2009 12:33:02

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

покритикуйте программу

использование collections.defaultdict

>>>import collections
>>>d = collections.defaultdict(int)
>>> d[1] += 10
>>> d
defaultdict(<type 'int'>, {1: 10})



Офлайн

#4 Ноя. 11, 2009 13:43:22

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

покритикуйте программу

Dimka665
использование collections.defaultdict
Спасибо! Буду знать.



Офлайн

#5 Ноя. 11, 2009 14:56:27

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

покритикуйте программу

После некотрых мучений в попытках разобраться с наследованием класса от 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()



Офлайн

#6 Ноя. 11, 2009 19:27:45

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

покритикуйте программу

defaultdict(lambda :defaultdict(int))
прокатило бы



Офлайн

#7 Ноя. 12, 2009 11:12:36

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

покритикуйте программу

Dimka665
defaultdict(lambda :defaultdict(int))
прокатило бы
Красиво! За это люблю питон.



Офлайн

#8 Ноя. 14, 2009 15:51:46

alex312
От:
Зарегистрирован: 2009-11-06
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

покритикуйте программу

А еще есть стандартный модуль csv , соответственно предназначеный для работы с файлами .csv



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version