Python中关于IP处理的两个模块
这里介绍的两个处理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混合合并也可以。