2013-04-26 143 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)将有助于提供更详细的建议。