【问题标题】:Python: TypeError: int() argument must be a string or a number, not 'IPv4Network'Python:TypeError:int() 参数必须是字符串或数字,而不是“IPv4Network”
【发布时间】: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


【解决方案1】:

据我了解,您的 xIPv4Network 实例而不是 int;所以int(x)无法将其转换为int;

可以转换的东西是IPv4Address实例;所以我的建议是你应该改变

 ip = ipaddress.IPv4Network(unicode(ip.strip()))

 ip = ipaddress.IPv4Address(unicode(ip.strip()))

--欧帕琴斯基

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 2015-12-03
    • 2013-12-30
    • 2020-04-24
    • 2017-03-01
    • 2020-10-04
    • 2021-12-14
    相关资源
    最近更新 更多