CSV阅读& write - IP匹配IP范围

时间:2013-04-26 16:17:37

标签: python csv ip cidr

我遇到了一个问题,但确实没有足够的Python知识 解决这个问题。我找到了一些类似的案例,对于真正的人来说 擅长Python这可能是一个非常小的任务要解决,如果你 想要!


问题:在两个输入源的监控范围内写下失败的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,
    

  4. 我在StackOverflow上发现了一些类似的问题:

    期待任何Python" pro" (从我的角度来看)想帮忙! :)

2 个答案:

答案 0 :(得分: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库。

答案 1 :(得分: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)将有助于提供更详细的建议。