2017-09-20 59 views
0

我有一個目錄充滿了從pcap轉換爲csv的非常大的csv文件。從pcap目錄中獲取最常見的ip到csv文件

我想遍歷該目錄中的每個csv文件並獲取最常見的源IP地址(第2列)。

目前我的輸出是不正確的,因爲它似乎已經設法讓每個文件在開始之前將其值轉儲到下一個文件中。每個文件似乎都有相同的IP,我知道情況並非如此。

ipCounter = collections.Counter() 

#iterate through all of the files in the directory, using glob 
for filename in glob.glob('/path/to/directory/*'): 
    with open(filename) as input_file: 
     #skip column titles 
     input_file.next() 

     for row in csv.reader(input_file, delimiter=','): 
      ipCounter[row[2]] += 1 

    print 'Source IPs most common in: %s' % filename 
    print ipCounter.most_common() 

我不完全親與Python,所以有可能是一個更好的方式來做到這一點,但是這是我到目前爲止得到。

回答

1

你的方法看起來不錯。如果您想要執行每個文件most_common(),但需要在for循環中移動您的計數器。或有兩個計數器,一個給你每個文件總,和第二給你的整個文件夾的總次數:

import collections 
import glob 

ip_counter_all = collections.Counter()  

for filename in glob.glob('ip*.csv'): 
    ip_counter = collections.Counter() 

    with open(filename) as input_file: 
     csv_input = csv.reader(input_file) 
     header = next(csv_input) 

     for row in csv_input: 
      ip_counter[row[2]] += 1 

    ip_counter_all.update(ip_counter) 

    print '\nSource IPs most common in: {}'.format(filename) 

    for ip_addr, count in ip_counter.most_common(): 
     print " {} {}".format(ip_addr, count) 

print '\nOverall IPs most common:' 

for ip_addr, count in ip_counter_all.most_common(): 
    print " {} {}".format(ip_addr, count) 

這將使你的輸出,如:

Source IPs most common in: ips.csv 
    1.1.1.1 2 
    1.2.3.4 1 
    1.4.2.3 1 

Source IPs most common in: ips2.csv 
    1.1.1.1 2 
    1.2.3.4 1 
    1.4.2.3 1 

Overall IPs most common: 
    1.1.1.1 4 
    1.2.3.4 2 
    1.4.2.3 2 

你可以也可以使用較新的format()顯示字符串的方法。