Форум сайта python.su
31
Здравствуйте
Можно ли остановить итерацию или выхватить определенную(допустим пятую по счету,которую выводит переменная for line in a.readlines():) в цикле for
Надо только пятый элемент списка,вернее переменная line десять раз принимает разное значение,10 разных списков,как выхватить пятый список?Что бы выводился только пятый из десяти?
Офлайн
25
a.readlines()[5]
# or
for i, line in enumerate(a.readlines()):
if i == 5:
break
Офлайн
31
Чем дальше тем больше)))))
В общем надо что бы на выходе был входящий трафик
Если по простому то:
import os
a = os.popen("netstat -e")
for line in a.readlines():
print line
import os
def ParseW(Str):
prevCh = ''
words = ['']
inQuote = False
for Ch in Str:
if(Ch==' ') and (prevCh!='\\') and (not inQuote):
if(len(words[len(words)-1])!=0):
words.append('')
else:
if(Ch=='"') and (prevCh!='\\') and (not inQuote):
if(len(words[len(words)-1])!=0):
words.append('')
words[len(words)-1] += Ch
inQuote = True
elif(Ch=='"') and (prevCh!='\\') and (inQuote):
words[len(words)-1] += Ch
words.append('')
inQuote = False
else:
words[len(words)-1] += Ch
prevCh = Ch
if(len(words[-1:][0])==0):
words.pop()
return words
a = os.popen("netstat -e ")
for i, line in enumerate(a.readlines()):
f=ParseW(line)
if i==5:
break
print f[1:-1]
Отредактировано (Янв. 22, 2012 20:22:56)
Офлайн
25
я не понял какие именно цифры вам нужны
поэтому сделал так:
#coding: cp1251
from re import compile as re_compile
from subprocess import Popen, PIPE
SPACE_CUTTER = re_compile('\s{2,}')
def reap_data(cmd_out):
return dict(map(lambda a: (a[0], (int(a[1]), int(a[2]))),\
filter(lambda a: len(a)==3,\
map(SPACE_CUTTER.split,\
filter(lambda a: a,\
map(lambda a: a.strip(),\
cmd_out.split('\r\n')))))))
def exec_cmd(cmd_line):
process = Popen(cmd_line.split(), shell=False, stdout=PIPE)
stdout, stderr = process.communicate()
return stdout.decode('cp866')
out = exec_cmd('netstat -e')
info = reap_data(out)
sent, got = info[u'Байт']
print sent, got
Офлайн
31
Супер….))))
Спасибо
а то уже голова кипела….
Отредактировано (Янв. 22, 2012 21:35:46)
Офлайн
25
если нужно чтобы консолька не ‘моргала’, сделайте shell=True
Офлайн
31
Ок
Я сначала через WMI пытался FROM Win32_PerfFormattedData_Tcpip_NetworkInterface но там как то с байтами все запутанно…или я не понял
а через netstat проще……спасибо еще раз
Офлайн
31
В итоге благодаря Вам собрал то что хотел, когда то делал под linux монитор трафика, взял оттуда алгоритм определения скорости в секунду кб,хотя может он и не совсем точный, еще под win xp не очень тестировал
#coding: cp1251
from re import compile as re_compile
from subprocess import Popen, PIPE
from Tkinter import *
import string
SPACE_CUTTER = re_compile('\s{2,}')
spisok1=[1,1,1,1]
def reap_data(cmd_out):
return dict(map(lambda a: (a[0], (int(a[1]), int(a[2]))),\
filter(lambda a: len(a)==3,\
map(SPACE_CUTTER.split,\
filter(lambda a: a,\
map(lambda a: a.strip(),\
cmd_out.split('\r\n')))))))
def exec_cmd(cmd_line):
process = Popen(cmd_line.split(), shell=True, stdout=PIPE)
stdout, stderr = process.communicate()
return stdout.decode('cp866')
def reader():
global label
while 1:
try:
out = exec_cmd('netstat -e')
info = reap_data(out)
sent, got = info[u'Байт']
kb = sent/1024
break
except:
continue
curtime = kb
a=int(spisok1[-1])
b=int(spisok1[-2])
spisok1.append(curtime)
curtime=a-b
speed=divmod(curtime, 1024)
del spisok1[0]
def cen(rub):
return "%i MB. %i KB." % (rub)
label["text"]="Speed: %s" %(cen (speed))
root.after(1000, reader)
root=Tk()
label=Label(root, text="******:")
label.pack(anchor=W)
reader()
root.title("Monitor Trafik")
root.mainloop()
Отредактировано (Янв. 27, 2012 18:19:16)
Офлайн
31
Может есть у кого на уме другой алгоритм измерения скорости трафика в секунду?
Офлайн