2012-02-09 51 views
2

已經有一段時間了,因爲我已經用for循環編寫函數,並且用我的無知來寫入文件。函數將行附加到.csv

該函數給出一個IP地址從文本文件讀取; ping 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可能會提高性能。在這方面,我有一些戲劇性的加速。我是一名生物信息學家,所以我花了很多時間從我的代碼中拍攝大型文本文件。

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

我使用方法5.並不需要很多的變化。那裏有一些更奇特的方法,但它們並沒有像我那樣吸引我。

+0

鑑於他正在ping一個IP地址500次,我不確定更快的IO會提高整體速度。 – MDT 2012-02-10 04:44:34

+0

由於每次追加都會導致分配新內存,因此追加比使用緩衝區更爲昂貴。如果列表變得足夠大,你可能會有一些令人興奮的事情發生。將一行附加到一個300MB的文件將導致舊對象的一個​​副本與您的新行結束。 (300 + 300 +行大小)性能差異不僅在速度(數量級),而且在內存消耗方面。 – gmoney 2012-02-10 20:08:33

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 2012-02-10 03:49:03

+0

那麼你的原始代碼中的錯誤也是這樣 - 它是由於在'os.system(「ping」+ IPadd4 +「-n 500> tmp」)'中'-n'之前沒有空格而引起的。 在'-n'之前加一個空格,代碼應該可以正常工作(我已經測試過了)。 我假設你的輸入IP地址後面有一個空格。 – MDT 2012-02-10 04:36:43

+0

我的歉意,我剛剛重新測試了更新的空間,現在它部分工作。如果我ping可以說-n 10. .csv只記錄一個1.任何想法? – onxx 2012-02-10 15:31:08