Python中IP地址列表转为CIDR列表

8 投票
7 回答
17600 浏览
提问于 2025-04-16 21:36

我怎么把一堆IP地址转换成CIDR格式的列表呢?谷歌的ipaddr-py库里有个叫做summarize_address_range(first, last)的方法,可以把两个IP地址(一个是开始,一个是结束)转换成CIDR格式的列表。不过,这个方法不能处理一整串的IP地址。

Example:
>>> list_of_ips = ['10.0.0.0', '10.0.0.1', '10.0.0.2', '10.0.0.3', '10.0.0.5']
>>> convert_to_cidr(list_of_ips)
['10.0.0.0/30','10.0.0.5/32']

7 个回答

5

你可以用一行代码来实现这个功能,使用netaddr这个库:

cidrs = netaddr.iprange_to_cidrs(ip_start, ip_end)
6

首先,你需要安装一个叫做 netaddr 的库。

你可以通过这个命令来安装它:
pip install netaddr

安装好之后,就可以使用 netaddr 提供的各种功能了:

# Generate lists of IP addresses in range.
ip_range = netaddr.iter_iprange(ip_start, ip_end)
# Convert start & finish range to CIDR.
ip_range = netaddr.cidr_merge(ip_range)
9

在Python3中,我们有一个内置的模块可以用来处理这个问题,叫做ipaddress。

list_of_ips = ['10.0.0.0', '10.0.0.1', '10.0.0.2', '10.0.0.3', '10.0.0.5']
import ipaddress
nets = [ipaddress.ip_network(_ip) for _ip in list_of_ips]
cidrs = ipaddress.collapse_addresses(nets)
list(cidrs)
Out[6]: [IPv4Network('10.0.0.0/30'), IPv4Network('10.0.0.5/32')]

撰写回答