【发布时间】:2019-08-16 23:24:14
【问题描述】:
我正在尝试从 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
"""
当前问题/错误:
for _, g in itertools.groupby(enumerate(sorted(ip_addresses)), lambda (i, x): i-int(x)): TypeError: int() 参数必须是字符串 或一个数字,而不是“IPv4Network”
【问题讨论】:
-
据我了解,您的 x 是 IPv4Network 实例而不是 int;所以 int(x) 无法将其转换为 int;可以转换的东西是 IPv4Address 实例;所以我的建议是你应该将 ip = ipaddress.IPv4Network(unicode(ip.strip())) 更改为 ip = ipaddress.IPv4Address(unicode(ip.strip()))
-
是的,你是对的。这就是问题所在。谢谢
标签: python python-2.7