CSV读写IP匹配IP范围

2024-05-16 23:47:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个问题,但是我没有足够的Python知识来 解决它。我发现了一些类似的案例 擅长Python如果你 想要!在


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

  1. 我有一个包含两列的CSV文件,“失败dips.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“pro”(从我的角度来看)愿意帮忙!:)


Tags: 文件ofcsvtoinipanhow
2条回答
#!/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库。在

下面是一个使用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)将有助于提供更详细的建议。在

相关问题 更多 >