2016-02-20 47 views
0

我有一個csv格式的服務器日誌。它有很多的IP地址。我正在編寫一個代碼,用於檢查每行是否具有所需的IP,並在IP匹配時將整行復制到新文件。這個過程需要爲多個IP地址完成。我怎樣才能得到匹配的IP在Python中的整個行?我們可以考慮一個「ip」地址作爲一個字符串使用fread和Python在Python?

fread = open("test1.csv","r") 
fwrite = open("test2.csv", 'a') 
strings = ['1.186.120.149', '1.186.8.1', '1.187.14.3', '99.253.12.8'] 
for line in fread: 
    if any(s in line for s in strings): 
     fwrite.write(line + "") 
fwrite.close() 
fread.close() 
+0

是什麼問題? –

+0

「test1.csv」中的IP地址是否與特定列中的「strings」中的IP地址進行比較? – e0k

+0

這對我來說很好。它不起作用嗎?你會得到什麼輸出? – jorgeh

回答

0

代碼對我來說看起來很好。

提示:打開蟒蛇控制檯,並與simpel代碼嘗試第一次(不讀,寫,讓你知道問題出在哪裏:

strings = ['1.186.120.149', '1.186.8.1', '1.187.14.3', '99.253.12.8'] 
lines =['Whatever without the ip','1.186.8.1 logged on'] 
for line in lines: 
    if any(s in line for s in strings): 
     line 

我對這個小測試代碼正確的輸出:

>>> strings = ['1.186.120.149', '1.186.8.1', '1.187.14.3', '99.253.12.8'] 
>>> lines =['baldie bla','1.186.8.1 logged on'] 
>>> for line in lines: 
... if any(s in line for s in strings): 
...  line 
... 
'1.186.8.1 logged on' 
>>> 

,並使用此:

with open(filenamepath, 'r') as f: 
    for line in f: 

這將自動退出時關閉與......

更好,使用單元測試......但我認爲這不是你的技能(但在早期階段尋找的東西,節省了大量的時間)TDD(測試驅動開發)

,並使用PDB(Python的調試器)

把這個代碼:

import pdb; pdb.set_trace() 

,你可以調試!

您可以鍵入變量以查看它們是什麼......並且將n代入下一行,或者q代表退出,s代表另一個函數等等。

0

CSV是文本文件,所以是的,您可以將IP地址視爲一個字符串。您演示了虛線IPv4地址表示法,這是表示IP地址的常用方式,但它不是唯一可行的方式。假設您的CSV使用虛線符號,那麼唯一的問題是區分類似的地址,如1.2.3.411.2.3.4

以下代碼使用正則表達式在一行中查找完整的IPv4地址,然後使用set邏輯來標識匹配。

import re 

ip4_addr_re = re.compile(r'\d+\.\d+\.\d+\.\d+') 

strings = ['1.186.120.149', '1.186.8.1', '1.187.14.3', '99.253.12.8'] 
ip4_set = set(strings) 

with open("test1.csv","r") as fread, open("test2.csv", 'a') as fwrite: 
    for line in fread: 
     if not ip4_set.isdisjoint(set(ip4_addr_re.findall(line))): 
      fwrite.write(line) 
相關問題