这里介绍的两个处理IP好用的Python库名为:ipaddr和netaddr

顺便提一个不好用的:IPy。上面两个能完全胜任这个库的功能,但这个库容错性不好,常报错。

1.ipaddr简单介绍:

Google开发的IP处理模块,地址:http://pythonhosted.org/ipaddr/

可用pip安装:pip install ipaddr

所有包含的类和方法使用help命令查看:

help(ipaddr)


Class总共分为:BaseIP、IPv4、IPv6
ipaddr.IPv4Network() ipv4网段对象建立
ipaddr.IPv6Network() ipv6网段对象建立
ipaddr.IPAddress(address, version) 单个ipv4地址对象建立


DEMO:

1)判断一个IP地址是否在某个网段内:

>>> import ipaddr
>>> 
>>> ip = ipaddr.IPv4Address("192.168.1.1")
>>> ipNet = ipaddr.IPv4Network("192.168.1.0/23")
>>> print ip in ipNet
True

返回True没问题,若不属于包含关系返回False

2)判断一个网段是否属于另一个网段:

>>> ipNetA = ipaddr.IPv4Network("192.168.1.0/24")
>>> ipNetB = ipaddr.IPv4Network("192.168.0.0/16")
>>> print ipNetA in ipNetB
True

3)判断是否属于内网IP:

>>> ip = ipaddr.IPv4Address("1.1.1.1")
>>> print ip.is_private
False
4)判断是否属于内网网段:

>>> ipNet = ipaddr.IPv4Network("10.123.1.0/24")
>>> print ipNet.is_private
True

5)返回子网中IP个数:

>>> ipNet = ipaddr.IPv4Network("192.168.0.0/16")
>>> print ipNet.numhosts
65536

6)遍历网段中所有IP:

>>> ipNet = ipaddr.IPv4Network("192.168.0.1/32")
>>> for ip in ipNet:
            print isinstance(ip, ipaddr.IPv4Address)
            print str(ip)

True
192.168.0.1

注意,这里遍历时返回的元素是ipaddr.IPv4Address对象,不是一个IP字符串,但可以转换。

7)根据索引访问网段中的某个IP:

>>> ipNet = ipaddr.IPv4Network("192.168.0.0/24")
>>> print str(ipNet[3])
192.168.0.3


2.netaddr介绍

也使用pip安装:pip install netaddr

help命令查看所有类和方法:

help(netaddr)

文档地址:https://netaddr.readthedocs.io/en/latest/

DEMO:

1)掩码转换:

>>> import netaddr
>>> 
>>> ipNetList = netaddr.iprange_to_cidrs("192.168.1.1", "192.168.1.100")
>>> print ipNetList
[IPNetwork('192.168.1.1/32'), IPNetwork('192.168.1.2/31'), IPNetwork('192.168.1.4/30'), IPNetwork('192.168.1.8/29'), IPNetwork('192.168.1.16/28'), IPNetwork('192.168.1.32/27'), IPNetwork('192.168.1.64/27'), IPNetwork('192.168.1.96/30'), IPNetwork('192.168.1.100/32')]

2)合并IP:

>>> ipList = [netaddr.IPAddress("1.1.1.1"), netaddr.IPAddress("1.1.1.2")]
>>> print netaddr.cidr_merge(ipList)
[IPNetwork('1.1.1.1/32'), IPNetwork('1.1.1.2/32')]

3)当然也可以合并网段:

>>> ipList = [netaddr.IPNetwork("1.1.3.0/23"), netaddr.IPNetwork("1.1.0.0/22")]
>>> print netaddr.cidr_merge(ipList)
[IPNetwork('1.1.0.0/22')]

网段和单个IP混合合并也可以。