如何从 Python 中的 CIDR 列表生成所有可能 IP 的列表,并从原始列表中为其分配另一列?

How can I generate a list of all possible IPs from a CIDR list in Python and assign another column to it from the original list?

我有一个 csv 文件,其中包含一列 CIDR IP 和一列,其中包含使用该 IP 的位置,如下所示:

   | CIDR         | Location   |
   | ------------ | ---------- |
   | x.x.x.x/24   | OFFICE     |
   | x.x.x.x/24   | DATACENTER |
   | x.x.x.x/25   | DATACENTER |
   | x.x.x.x/26   | DATACENTER |

csv 继续, 我想从中创建一个新的 csv 文件,将 CIDR 扩展到所有可能的 IP,但仍然有正确的位置与之相关。

  | IPs       | Location |
  | --------  | -------  |
  | y.y.y.y   | OFFICE   |
  | y.y.y.y   | OFFICE   |
  | y.y.y.y   | OFFICE   |
  | y.y.y.y   | OFFICE   |
  | y.y.y.y   | OFFICE   |

等等

假设您的 DataFrame 具有 有效 CIDR,您可以合并 ipaddress.IPv4Network and pandas.DataFrame.explode:

import ipaddress
df2 = (df.assign(CIDR=df['CIDR'].map(lambda x: list(ipaddress.IPv4Network(x))))
         .explode('CIDR')
      )

示例输入:

df = pd.DataFrame({'CIDR': ['192.168.1.0/24', '10.0.0.0/24'],
                   'Location': ['OFFICE', 'DATACENTER']})

输出:

           CIDR    Location
0   192.168.1.0      OFFICE
0   192.168.1.1      OFFICE
0   192.168.1.2      OFFICE
0   192.168.1.3      OFFICE
0   192.168.1.4      OFFICE
..          ...         ...
1    10.0.0.251  DATACENTER
1    10.0.0.252  DATACENTER
1    10.0.0.253  DATACENTER
1    10.0.0.254  DATACENTER
1    10.0.0.255  DATACENTER

[512 rows x 2 columns]

一种方法是使用 netaddr 模块并应用于 CIDR 列

>>> import netaddr
>>> data = {
    'CIDR': ['10.0.0.0/29', '10.1.2.0/30',  '192.168.1.0/29', '172.16.0.0/29'],
    'Location': [  'OFFICE',  'DATACENTER',  'DATACENTER', 'DATACENTER']}
>>> df = pd.DataFrame(data)
>>> pd.concat([df,df.CIDR.apply(netaddr.IPNetwork).explode().rename('IP')], axis=1)


    CIDR            Location    IP
0   10.0.0.0/29     OFFICE      10.0.0.0
0   10.0.0.0/29     OFFICE      10.0.0.1
0   10.0.0.0/29     OFFICE      10.0.0.2
0   10.0.0.0/29     OFFICE      10.0.0.3
0   10.0.0.0/29     OFFICE      10.0.0.4
0   10.0.0.0/29     OFFICE      10.0.0.5
0   10.0.0.0/29     OFFICE      10.0.0.6
0   10.0.0.0/29     OFFICE      10.0.0.7
1   10.1.2.0/30     DATACENTER  10.1.2.0
1   10.1.2.0/30     DATACENTER  10.1.2.1
1   10.1.2.0/30     DATACENTER  10.1.2.2
1   10.1.2.0/30     DATACENTER  10.1.2.3
2   192.168.1.0/29  DATACENTER  192.168.1.0
2   192.168.1.0/29  DATACENTER  192.168.1.1
2   192.168.1.0/29  DATACENTER  192.168.1.2
2   192.168.1.0/29  DATACENTER  192.168.1.3
2   192.168.1.0/29  DATACENTER  192.168.1.4
2   192.168.1.0/29  DATACENTER  192.168.1.5
2   192.168.1.0/29  DATACENTER  192.168.1.6
2   192.168.1.0/29  DATACENTER  192.168.1.7
3   172.16.0.0/29   DATACENTER  172.16.0.0
3   172.16.0.0/29   DATACENTER  172.16.0.1
3   172.16.0.0/29   DATACENTER  172.16.0.2
3   172.16.0.0/29   DATACENTER  172.16.0.3
3   172.16.0.0/29   DATACENTER  172.16.0.4
3   172.16.0.0/29   DATACENTER  172.16.0.5
3   172.16.0.0/29   DATACENTER  172.16.0.6
3   172.16.0.0/29   DATACENTER  172.16.0.7