我必须要csv文件。 第一个看起来像这样:
第二个包含IP列表:
139.15.250.196
139.15.5.176
我想检查第一个文件中是否有给定的IP地址在第二个文件中。这可以正常工作(如果我的代码损坏,请更正或提供提示),但问题是第一个文件包含许多重复值,例如10.0.0.1可能会出现x次,而我找不到删除重复项的方法。你能帮我还是指导一下?
import csv
filename = 'ip2.csv'
with open(filename) as f:
reader = csv.reader(f)
ip = []
for row in reader:
ip.append(row[0])
filename = 'bonk_https.csv'
with open(filename) as f:
reader = csv.reader(f)
ip_ext = []
for row in reader:
ip_ext.append(row[0])
for a in ip:
if a in ip_ext:
print(a)
答案 0 :(得分:3)
您可以使用set(list)
将任何列表投射到集合中。一组仅包含每个项目之一,并且可以像列表一样与member in set
进行比较。因此,只需将您的IP列表转换为一组即可。
with open(filename) as f:
ip_ext = []
for row in reader:
ip_ext.append(row[0])
for a in set(ip):
if a in set(ip_ext): #well, you don't need a set her unless you also have duplicates in ip_ext
print(a)
或者,如果找到条目,则中断/继续。 This might help you with that
答案 1 :(得分:1)
我建议您归一化所有IP,
with open(...) as f
# a set comprehension of _normalized_ ips, this strips excess trailing zeros
my_ips = {'.'.join('%d'%int(n) for n in t)
for t in [x.split(',')[0].split('.') for x in f]}
接下来,您要对照归一化集合中包含的IP来检查第二个文件中的每个归一化IP(请注意,与其他答案不同,这里有一个循环,并且检查是否一个项目是集合x in my_xs
的成员,是一个高度优化的操作)
with open(...) as f:
for line in f:
ip = '.'.join('%d'%int(n) for n in line.split('.'))
if ip in my_ips:
...
else:
...