【问题标题】:Converting CIDR IP address ranges using ipaddress and output to a data frame使用 ipaddress 转换 CIDR IP 地址范围并输出到数据帧
【发布时间】:2018-12-24 22:43:03
【问题描述】:

我有一个数据帧,其中包含 IPv4 和 IPv6 CIDR IP 地址范围(必要时可以拆分)。我希望采用这些范围并使用范围内的每个地址创建一个数据框,因此我可以将其与另一个数据框连接以进行一些过滤。

使用ipaddress包,展开列表的功能是:

a = ip.ip_network('103.21.244.0/22')
    for x in a.hosts():
    print(x)

这会生成一个仅包含此 IP 范围的列表。有谁知道如何输入一系列 CIDR 范围,这样我就不必执行上述 n 次?如果我用数据框的引用代替上面的 IP 地址,我会收到一个 ValueError,指出它似乎不是 IPv4 或 IPv6 网络。

第二个问题,作为 Python 新手,我需要做什么才能将这些扩展范围放入列表或数据框中?我试过这个:

a = ip.ip_network('103.21.244.0/22')
ip_list = [] #x for x in a.hosts()
for x in a.hosts():
    ip_list.append(x)
ip_list

最终得到:

[IPv4Address('103.21.244.1'),
 IPv4Address('103.21.244.2'),
 IPv4Address('103.21.244.3'),
 IPv4Address('103.21.244.4'),
 IPv4Address('103.21.244.5'),
 ...]

我确信有比获取该输出和正则表达式 IP 地址更好的方法。

【问题讨论】:

    标签: python python-3.x jupyter-notebook


    【解决方案1】:
    a = ip.ip_network('103.21.244.0/22')
    ip_list = [] #x for x in a.hosts()
    for x in a.hosts():
        ip_list.append(x.compressed) # 
    ip_list
    

    【讨论】:

      【解决方案2】:

      关于第一个问题,如果模块不支持,恐怕你做不到,我认为它不支持given the docs。除了传统的 for 循环之外,Python 还提供了两种将方法应用于列表的方法:

      map() 方式,对列表的所有项应用操作并返回结果的generator

      def get_single_ip_from_cidr(cidr):
          # ...
      cidr_list = ["10.0.0.0/8","192.168.0.0/16"]
      results_generator = map(get_single_ip_from_cidr, cidr_list)
      print(list(results_generator)) # Casting results_generator to list as you cant print generators directly
      

      List comprehensions的pythonic方式:

      def get_single_ip_from_cidr(cidr):
          # ...
      results = [get_single_ip_from_cidr(cidr_addr) for cidr_addr in cidr_list] 
      

      关于第二个问题,您获得的列表是 IPv4Address 对象的列表,您只是看到它的字符串化表示。通过使用help(ipaddress.IPv4Address),您可以看到它有两个名为compressedexploded 的属性,它们都产生了您想要的(我假设两者之间的差异仅在您可以使用:: 的IPv6 中相关作为一组零的简写):

      a = ip.ip_network('103.21.244.0/22')
      ip_list = [addr.compressed for addr in a.hosts()]
      

      Jeff 的回答是完全一样的,但更冗长。

      因此,您可以重构整个代码以从网络列表中获取所有主机,如下所示:

      import ipaddress as ip
      
      def get_ip_from_cidr(cidr):
          return [addr.compressed for addr in ip.ip_network(cidr)]
      
      cidr_list = ["192.168.0.0/30","10.0.0.0/26"] 
      print([get_ip_from_cidr(cidr) for cidr in cidr_list])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-22
        • 2017-04-23
        • 2012-11-07
        • 2017-08-23
        • 2017-01-04
        • 1970-01-01
        • 2010-11-05
        相关资源
        最近更新 更多