0

我有一个问题,但没有足够的 Python 知识来解决它。我发现了一些类似的案例,所以对于真正擅长 Python 的人来说,如果你愿意的话,这可能是一个非常小的任务要解决!


问题:从两个输入源写入受监控范围内的失败 IP 列表

  1. 我有一个包含两列“FailedIPs.csv”的 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“专业人士”(从我的角度来看)!:)

4

2 回答 2

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库。

于 2013-04-26T17:31:28.603 回答
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 一样,简化您要解决的问题的组成部分(匹配 IP、使用csv)将有助于提供更详细的建议。

于 2013-04-26T17:37:11.203 回答