兩個處理IP好用的Python庫ipaddr和netaddr

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章