我遇到了一个问题,但确实没有足够的Python知识 解决这个问题。我找到了一些类似的案例,对于真正的人来说 擅长Python这可能是一个非常小的任务要解决,如果你 想要!
问题:在两个输入源的监控范围内写下失败的IP列表
我有一个包含两列的CSV文件," FailedIPs.csv":
State, FailedIP,
1, 178.203.178.159,
然后我又找到了另一个带有ISP名称和CIDR的文件," IPranges.csv":
ISPname, IPrange,
Vodafone, 88.128.64.0/18,
我想生成一个CSV,其中包含所提供范围之一的所有失败IP地址:
State, FailedIP, ISPname, IPrange,
1, 178.203.178.159, Vodafone, 168.00.64.0/32,
我在StackOverflow上发现了一些类似的问题:
期待任何Python" pro" (从我的角度来看)想帮忙! :)
答案 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)将有助于提供更详细的建议。