Python学习笔记-IP地址处理模块Ipy

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
公网NAT网关,每月750个小时 15CU
简介:

IP地址处理模块Ipy

    IPy模块可以很好的辅助我们高效完成IP的规划工作。

    参考:https://github.com/autocracy/python-ipy

        安装IPy模块

1
[root@kurol ~] # python36 -m easy_install -i http://pypi.douban.com/simple/ IPy

       导入模块

1
In [ 12 ]:  from  IPy  import  IP

1、IP地址、网段的基本处理

        通过version区分IPv4和IPv6:

1
2
3
4
5
In [ 13 ]: testip  =  ( '10.0.0.0/8' , '::1' )
In [ 14 ]: IP(testip[ 0 ]).version()
Out[ 14 ]:  4
In [ 15 ]: IP(testip[ 1 ]).version()
Out[ 15 ]:  6

        通过指定的网段输出该网段的IP个数及所有IP地址清单:

1
2
3
4
5
6
7
8
9
10
In [ 25 ]: testip1  =  IP( '192.168.1.0/24' )
In [ 26 ]:  print  (testip1. len ())
256
In [ 27 ]:  for  in  testip1:
  ...:  print  (x)
  ...: 
192.168 . 1.0
192.168 . 1.1
192.168 . 1.2
......

 IP类常用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
In [ 32 ]: testip2  =  IP( '192.168.100.10' )
 
In [ 33 ]: testip2.reverseNames()  #反向解析地址格式
Out[ 33 ]: [ '10.100.168.192.in-addr.arpa.' ]
 
In [ 34 ]: testip2.iptype()    #返回IP类型,192.168.100.10为私有地址
Out[ 34 ]:  'PRIVATE'
 
In [ 35 ]: IP( '8.8.8.8' ).iptype()    #返回IP类型,8.8.8.8为共有地址
Out[ 35 ]:  'PUBLIC'
 
In [ 36 ]: testip2. int ()   #转换成整型格式
Out[ 36 ]:  3232261130
 
In [ 37 ]: testip2.strHex()    #转换成十六进制格式
Out[ 37 ]:  '0xc0a8640a'
 
In [ 38 ]: testip2.strBin()    #转换成二进制格式
Out[ 38 ]:  '11000000101010000110010000001010'
 
In [ 39 ]:  print  (IP( 0xc0a8640a ))    #十六进制转成IP格式
192.168 . 100.10

        网络地址转换,根据IP与掩码生成网段格式:

1
2
3
4
5
6
In [ 47 ]:  print  (IP( '192.168.1.0' ).make_net( '255.255.255.0' ))
192.168 . 1.0 / 24
In [ 48 ]:  print  (IP( '192.168.1.0/255.255.255.0' ,make_net = True ))
192.168 . 1.0 / 24
In [ 49 ]:  print  (IP( '192.168.1.0-192.168.1.255' ,make_net = True ))
192.168 . 1.0 / 24

  通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段。输出类型为字符串:

wantprefixlen取值及含义:

  •     wantprefixlen=0,无返回,如192.168.1.0

  •     wantprefixlen=1,prefix格式,如192.168.1.0/24

  •     wantprefixlen=2,decimalnetmask格式,如192.168.1.0/255.255.255.0

  •     wantprefixlen=3,lastIP格式,如192.168.1.0-192.168.1.255

1
2
3
4
5
6
7
8
9
10
11
12
13
14
In [ 52 ]: IP( '192.168.1.0/24' ).strNormal(wantprefixlen = 0 )
Out[ 52 ]:  '192.168.1.0'
In [ 53 ]: IP( '192.168.1.0/24' ).strNormal(wantprefixlen = 1 )
Out[ 53 ]:  '192.168.1.0/24'
 
#省略wantprefixlen
In [ 54 ]: IP( '192.168.1.0/24' ).strNormal( 0 )
Out[ 54 ]:  '192.168.1.0'
In [ 55 ]: IP( '192.168.1.0/24' ).strNormal( 1 )
Out[ 55 ]:  '192.168.1.0/24'
In [ 56 ]: IP( '192.168.1.0/24' ).strNormal( 2 )
Out[ 56 ]:  '192.168.1.0/255.255.255.0'
In [ 57 ]: IP( '192.168.1.0/24' ).strNormal( 3 )
Out[ 57 ]:  '192.168.1.0-192.168.1.255'

2、多网络计算方法

    IPy支持类似于数值型数据的比较,以帮助IP对象进行比较

1
2
3
4
In [ 67 ]: IP( '10.0.0.0/24' ) > IP( '12.0.0.0/24' )
Out[ 67 ]:  False
In [ 68 ]: IP( '10.0.0.0/24' ) < IP( '12.0.0.0/24' )
Out[ 68 ]:  True

 判断IP地址和网段是否包含于另一个网段中:

1
2
3
4
5
6
In [ 69 ]:  '192.168.1.100'  in  IP( '192.168.1.0/24' )
Out[ 69 ]:  True
In [ 70 ]:  '192.168.2.100'  in  IP( '192.168.1.0/24' )
Out[ 70 ]:  False
In [ 71 ]:  '192.168.1.0/24'  in  IP( '192.168.0.0/16' )
Out[ 71 ]:  True

判断两个网段是否存在重叠,采用IPy提供的overlaps方法:

1
2
3
4
In [ 74 ]: IP( '192.168.0.0/23' ).overlaps( '192.168.1.0/24' )
Out[ 74 ]:  1   #返回1代表存在重叠
In [ 75 ]: IP( '192.168.1.0/24' ).overlaps( '192.168.2.0' )
Out[ 75 ]:  0 #返回0代表不存在重叠

实例:根据输入的IP或子网返回网络、掩码、广播、反向解析、子网数、IP类型等信息:

1
[root@kurol pkg1] # vim testip.py 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/python
#coding:utf-8
#
from  IPy  import  IP
import  sys 
reload (sys)
sys.setdefaultencoding( 'utf-8' )
ip_test  =  raw_input ( '请输入IP地址或网段地址:' )
ips  =  IP(ip_test)
if  len (ips) >  1 :
  print  ( '网络地址:%s'  %  ips.net())
  print  ( '掩码:%s'  %  ips.netmask())
  print  ( '网络广播地址:%s'  %  ips.broadcast())
  print  ( '地址反向解析:%s'  %  ips.reverseNames())
  print  ( '网络子网数:%s'  %  len (ips))
else :
  print  ( 'IP反向解析 %s'  %  ips.reverseNames())
print  ( '此IP地址转换成十六进制: %s'  %  ips.strHex())
print  ( '此IP地址转换成二进制: %s'  %  ips.strBin())
print  ( '此IP地址类型: %s'  %  ips.iptype())


执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@kurol pkg1] # python testip.py 
请输入IP地址或网段地址:192.168.1.0 /24
网络地址:192.168.1.0
掩码:255.255.255.0
网络广播地址:192.168.1.255
地址反向解析:[ '1.168.192.in-addr.arpa.' ]
网络子网数:256
此IP地址转换成十六进制: 0xc0a80100
此IP地址转换成二进制: 11000000101010000000000100000000
此IP地址类型: PRIVATE
 
[root@kurol pkg1] # python testip.py 
请输入IP地址或网段地址:192.168.1.1
IP反向解析 [ '1.1.168.192.in-addr.arpa.' ]
此IP地址转换成十六进制: 0xc0a80101
此IP地址转换成二进制: 11000000101010000000000100000001
此IP地址类型: PRIVATE






      本文转自谢育政 51CTO博客,原文链接:http://blog.51cto.com/kurolz/1935068 ,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
3天前
|
安全 Python
Python脚本实现IP按段分类
【10月更文挑战第04天】
14 7
|
8天前
|
JSON API 数据格式
30天拿下Python之requests模块
30天拿下Python之requests模块
18 7
|
7天前
|
人工智能 数据可视化 搜索推荐
Python异常模块与包
Python异常模块与包
|
7天前
|
Linux Python Windows
一个Python模块Pendulum的问题
一个Python模块Pendulum的问题
12 0
|
8天前
|
API Python
30天拿下Python之matplotlib模块
30天拿下Python之matplotlib模块
|
8天前
|
SQL 数据处理 数据库
30天拿下Python之pandas模块
30天拿下Python之pandas模块
|
8天前
|
存储 索引 Python
30天拿下Python之numpy模块
30天拿下Python之numpy模块
10 0
|
8天前
|
开发者 Python
30天拿下Python之logging模块
30天拿下Python之logging模块
|
5月前
|
Python 人工智能 数据可视化
Python模块与包(八)
Python模块与包(八)
44 0
Python模块与包(八)
|
8天前
|
开发者 Python
30天拿下Python之模块和包
30天拿下Python之模块和包
下一篇
无影云桌面