2013-04-26 195 views
0

我有一個問題,但沒有足夠的Python知識來解決它。我發現了一些類似的情況,所以對於真正的 擅長Python的人來說,這可能是一個非常小的任務來解決,如果你想 !CSV讀寫&IP匹配IP範圍


問題:一個監視範圍內寫的失敗IP的列表,兩個輸入信號源

  1. 我有一個CSV有兩列,「FailedIPs.csv」文件:

    State, FailedIP, 
    1, 178.203.178.159, 
    
  2. 然後我得到了與ISP的名稱和CIDR, 「IPranges.csv」 另一個文件:

    ISPname, IPrange, 
    Vodafone, 88.128.64.0/18, 
    
  3. 我想製作一個CSV它包含了所有在所提供的範圍中的一個失敗的IP地址:

    State, FailedIP, ISPname, IPrange, 
    1, 178.203.178.159, Vodafone, 168.00.64.0/32, 
    

我發現了一些類似的問題在這裏StackOverflow上:

期待任何Python的「親」(從我的角度來看),就是想幫助! :)

+0

File2 CSV IPranges.csv文件中有多少行? – Aya 2013-04-26 16:24:55

+0

爲了這個問題,在很大程度上它的價值和意義真的沒有關係。將問題簡化爲其組件將是非常有益的。 – UpAndAdam 2013-04-26 16:36:06

+0

你能否進一步表達你被卡住的地方?如果不是這個帖子可能會被封閉,因爲這是一個具體的細節,而且沒有做足夠的研究。 – UpAndAdam 2013-04-26 16:40:38

回答

0
#!/usr/bin/env python2 
import csv 
from IPy import IP 

def get_IP_ranges(filename): 
    with open(filename, 'rb') as csv_file: 
     csv_reader = csv.reader(csv_file) 
     next(csv_reader) # skip header 
     for ISP, IP_range in csv_reader: 
      yield IP(IP_range, make_net=True), ISP 

def get_failed_IPs(filename): 
    with open(filename, 'rb') as csv_file: 
     csv_reader = csv.reader(csv_file) 
     next(csv_reader) # skip header 
     for state, failed_IP in csv_reader: 
      yield state, IP(failed_IP) 

IP_ranges = tuple(get_IP_ranges('IPranges.csv')) 
with open('join.csv', 'wb') as join_csvfile: 
    join_writer = csv.writer(join_csvfile) 
    join_writer.writerow(('State', 'FailedIP', 'ISPname', 'IPrange')) 
    for state, failed_IP in get_failed_IPs('FailedIPs.csv'): 
     for IP_range, ISP in IP_ranges: 
      if failed_IP in IP_range: 
       break 
     else: 
      continue 
     join_writer.writerow((state, failed_IP, ISP, IP_range)) 

它使用IPy庫。

+0

感謝您的回覆! – user2324240 2013-05-01 12:46:35

+0

5分鐘編輯: 非常感謝回覆!綾:嗨,這個特殊的任務大約200(194)。 [at] UpAndAdam:嗨,老實說,我只是在學習Python本身。我不是一個開發者(根本)。在大學就Java中的一門管理課程參加了一門Java課程,以瞭解基礎知識。 @Cristian Ciupitu你給出的答案非常有幫助,我會試着看看我是否可以把它寫成一個完整的工作腳本:)! 任何進一步的意見或幫助,非常感謝你們 – user2324240 2013-05-01 12:54:49

+0

如果您有任何問題發表評論。 – 2013-05-02 02:36:25

0

以下示例說明如何使用csv模塊加載文件,並使用函數來測試第一個文件的IP地址是否在另一個的IP範圍內。我對使用IP地址並不熟悉,但如上所述,ipaddress模塊可能在此處很有用。

import csv 

#Modify this function to check if an IP address falls within a range 
def ismatch(ipadress, iprange): 
    return ipadress == iprange 

#Load CSVs 
failed = csv.DictReader(open('File1 CSV IPfailed.csv')) 
ranges = csv.DictReader(open('File2 CSV IPrange.csv')) 
#list for ranges, since will iterate multiple times 
rangelist = [row for row in ranges] 

#Add cases where FailedIP entry == IPrange entry 
matches = [] 
for ii in failed: 
    for jj in rangelist: 
     if ismatch(ii[' FailedIP'], jj[' IPrange']): 
      ii.update(jj)      #merge jj dict entries into ii 
      matches.append(ii)     #add to matches 

#Output 
fieldnames = ranges.fieldnames + failed.fieldnames  #list of all field names 
with open('IPmatches.csv', 'w') as f_out: 
    writer = csv.DictWriter(f_out, fieldnames) 
    writer.writeheader() 
    writer.writerows(matches) 

有一點要注意的是,字段名開頭空格,因爲在您的CSV文件的頭字段之間的空間。如果您的字段名在CSV文件頭部的引號內,那麼DictReader將不會在前面添加這些空格。

由於此腳本遍歷每個失敗的IP地址的IP範圍,因此它可能無法擴展到您的問題。像上面提到的UpAndAdam一樣,簡化您嘗試解決的問題的組件(使用csv匹配IP)將有助於提供更詳細的建議。