我正在尝试从csv中读取IP地址并将其转换为IP范围,并按每个类别对它们进行排列/分组。
下面是我的代码:
def create_range(ip_addresses):
groups = []
for _, g in itertools.groupby(enumerate(sorted(ip_addresses)), lambda (i, x): i-int(x)):
group = map(operator.itemgetter(1), g)
if len(group) > 1:
groups.append("{}-{}".format(group[0], str(group[-1])))
else:
groups.append(str(group[0]))
return groups
ips = collections.defaultdict(list)
with open('some.csv') as csv_file:
file_reader = csv.reader(csv_file)
next(file_reader)
for (ip, cat, typ) in file_reader:
ip = ipaddress.IPv4Network(unicode(ip.strip()))
cat = cat.strip()
ips[cat.strip()].append(ip)
resultIPranges = {org: create_range(ip_range) for cat, ip_range in ips.items()}
我的CSV如下:
csv_file = """ip, cat, typ
50.102.182.2, myCompany, blue
52.102.182.4, myCompany, blue
52.102.182.1, myCompany, blue
52.102.182.5, myCompany, blue
52.102.182.3, myCompany, blue
27.101.178.17, myCompany, blue
27.101.178.16, hisComp, red
27.101.178.15, hisComp, red
23.201.165.7, hisComp, red
55.200.162.10, hisComp, red
55.200.162.12, hisComp, red
55.200.162.13, hisComp, red
55.200.162.11, hisComp, red
30.101.102.4, hisComp, red
"""
当前问题/错误:
对于_,itertools.groupby(enumerate(sorted(ip_addresses)))中的g lambda(i,x):i-int(x)):TypeError:int()参数必须是字符串 或数字,而不是“ IPv4Network”
答案 0 :(得分:1)
据我了解,您的x
是IPv4Network
实例,而不是int
;因此int(x)
无法将其转换为int;
可以转换的事物是IPv4Address
实例;所以我的看法是,您应该更改
ip = ipaddress.IPv4Network(unicode(ip.strip()))
到
ip = ipaddress.IPv4Address(unicode(ip.strip()))
– opalczynski