2012-02-09 2 views
2

Прошло некоторое время с тех пор, как я написал функции для циклов и записи в файлы, настолько обнаженные с моим невежеством.Функция добавляет строки в .csv

Эта функция получает IP-адрес для чтения из текстового файла; пингует IP, ищет полученные пакеты, а затем добавляет его в .csv

Мой вопрос: есть ли лучший или простой способ написать это?

def pingS (IPadd4): 
    fTmp = "tmp" 
    os.system ("ping " + IPadd4 + "-n 500 > tmp") 
    sName = siteNF #sys.argv[1] 
    scrap = open(fTmp,"r") 
    nF = file(sName,"a") # appends 
    nF.write(IPadd4 + ",") 

    for line in scrap: 
    if line.startswith(" Packets"): 
     arrT = line.split(" ") 
     nF.write(arrT[10]+" \n") 
    scrap.close() 
    nF.close() 

Примечание: Если вам нужен полный сценарий, я могу поставить, что хорошо.

ответ

-1

Это может быть не прямой ответ, но вы можете получить некоторое увеличение производительности от использования StringIO. У меня было несколько серьезных ускорений в IO с этим. Я парень из биоинформатики, поэтому я трачу много времени на сбор больших текстовых файлов из своего кода.

http://www.skymind.com/~ocrow/python_string/

Я использую метод 5. Не требует много изменений. Там есть какие-то причудливые методы, но они не понравились мне.

+0

Учитывая, что он пингует IP-адрес 500 раз, я не уверен, что быстрее IO значительно увеличит общую скорость. – MDT

+0

Добавление более дорогое, чем использование буфера, из-за каждого добавления, вызывающего выделение новой памяти. Если список становится достаточно большим, у вас могут быть интересные вещи. Добавление одной строки в файл размером 300 МБ приведет к копированию старого объекта с вашей новой строкой в ​​конце. (300 + 300 + размер линии). Разница в производительности - это не только скорость (по порядку величины), но и потребление памяти. – gmoney

1

Это, по моему мнению, по крайней мере делает то, что происходит более очевидно. Len ('Received ='), очевидно, может быть заменено константой.

def pingS (IPadd4):  
    fTmp = "tmp"  
    os.system ("ping " + IPadd4 + "-n 500 > tmp")  
    sName = siteNF #sys.argv[1]  
    scrap = open(fTmp,"r")  
    nF = file(sName,"a") # appends 

    ip_string = scrap.read() 
    recvd = ip_string[ip_string.find('Received = ') + len('Received = ')] 
    nF.write(IPadd4 + ',' + recvd + '\n') 

Вы также можете попробовать, глядя на Python csv module для записи в формате CSV. В этом случае это довольно тривиально.

+0

Я тестирую ваш код и не работает, он возвращает значение 'вместо значения полученных пакетов. – onxx

+0

Эти ошибки в вашем исходном коде тоже, это происходит потому, что перед '-n' в 'os.system («ping» + IPadd4 + »-n 500> tmp«) не должно быть места. Поместите пробел перед «-n», и код должен работать нормально (я его протестировал). Я предполагал, что ваш ввод IP-адресов имел место после них. – MDT

+0

Приношу свои извинения, я только что перепроверил с обновленным пространством, и теперь он частично работает. Если я пинг скажут -n 10. CSV записывает только 1. Любые идеи? – onxx

Смежные вопросы