IP Range to CIDR conversion in Python?
Question:
How can I get a CIDR notation representing a range of IP addresses, given the start and end IP addresses of the range, in Python? I can find CIDR to IP Range but cannot find any code for the reverse.
Example of the desired output:
startip = '63.223.64.0'
endip = '63.223.127.255'
return '63.223.64.0/18'
Answers:
You may use iprange_to_cidrs
provided by netaddr module. Example:
pip install netaddr
import netaddr
cidrs = netaddr.iprange_to_cidrs(startip, endip)
Here are the official docs: https://netaddr.readthedocs.io/
Starting Python 3.3 the bundled ipaddress can provide what you want. The function summarize_address_range returns an iterator with the networks resulting from the start, end you specify:
>>> import ipaddress
>>> startip = ipaddress.IPv4Address('63.223.64.0')
>>> endip = ipaddress.IPv4Address('63.223.127.255')
>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(startip, endip)]
[IPv4Network('63.223.64.0/18')]
If, like me, you want only 1 cidr (instead of multiple cidr’s) you’ll need to use the spanning_cidr
function from either netaddr
pip install netaddr
from netaddr import spanning_cidr
spanning_cidr(startip, endip)
pip install spanning-cidr
from spanning_cidr import spanning_cidr
spanning_cidr([startip, endip])
Here is the difference…
>>> from ipaddress import IPv4Address, summarize_address_range
>>> from netaddr import spanning_cidr
>>>
>>> startip = IPv4Address('63.223.64.0')
>>> endip = IPv4Address('63.224.127.255')
>>> list(summarize_address_range(startip, endip))
[IPv4Network('63.223.64.0/18'),
IPv4Network('63.223.128.0/17'),
IPv4Network('63.224.0.0/17')]
>>>
>>> spanning_cidr(startip, endip)
IPv4Network('63.192.0.0/10')
How can I get a CIDR notation representing a range of IP addresses, given the start and end IP addresses of the range, in Python? I can find CIDR to IP Range but cannot find any code for the reverse.
Example of the desired output:
startip = '63.223.64.0'
endip = '63.223.127.255'
return '63.223.64.0/18'
You may use iprange_to_cidrs
provided by netaddr module. Example:
pip install netaddr
import netaddr
cidrs = netaddr.iprange_to_cidrs(startip, endip)
Here are the official docs: https://netaddr.readthedocs.io/
Starting Python 3.3 the bundled ipaddress can provide what you want. The function summarize_address_range returns an iterator with the networks resulting from the start, end you specify:
>>> import ipaddress
>>> startip = ipaddress.IPv4Address('63.223.64.0')
>>> endip = ipaddress.IPv4Address('63.223.127.255')
>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(startip, endip)]
[IPv4Network('63.223.64.0/18')]
If, like me, you want only 1 cidr (instead of multiple cidr’s) you’ll need to use the spanning_cidr
function from either netaddr
pip install netaddr
from netaddr import spanning_cidr
spanning_cidr(startip, endip)
pip install spanning-cidr
from spanning_cidr import spanning_cidr
spanning_cidr([startip, endip])
Here is the difference…
>>> from ipaddress import IPv4Address, summarize_address_range
>>> from netaddr import spanning_cidr
>>>
>>> startip = IPv4Address('63.223.64.0')
>>> endip = IPv4Address('63.224.127.255')
>>> list(summarize_address_range(startip, endip))
[IPv4Network('63.223.64.0/18'),
IPv4Network('63.223.128.0/17'),
IPv4Network('63.224.0.0/17')]
>>>
>>> spanning_cidr(startip, endip)
IPv4Network('63.192.0.0/10')