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混合合併也可以。