Python模块学习 - IPy
简介
在IP地址规划中,涉及到计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等,即便是专业的网络人员也要进行繁琐的计算,而IPy模块提供了专门针对IPV4地址与IPV6地址的类与工具,可以帮助实现计算子网掩码、网络掩码、广播地址、子网数、IP类型等。
# 安装ipy
pip3 install ipy
基本使用
ipy模块内部主要主要提供了IP类、IPint类,IPset类,我们常用的就是IP类,这个类可以接受几乎任何格式的IP地址和网段。
常用方法
version():获取IP地址的版本
>>> from IPy import IP
>>> IP('10.0.0.1').version()
4
>>> IP('10.0.0.0/24').version()
4
>>> IP('::1').version()
6 # 4 表示 IPv4, 6 表示 IPv6
len():获取子网IP地址的个数
>>> from IPy import IP
>>> ip = IP('10.0.0.0/27')
>>> ip.len()
32 # 纯的IP个数,我们需要排除网络地址和广播地址,所以可用地址是30个
iptpe():获取IP地址的类型
>>> from IPy import IP
>>> ip = IP('10.0.0.1')
>>> ip.iptype()
'PRIVATE'
>>> ip = IP('8.8.8.8')
>>> ip.iptype()
'PUBLIC' # PRIVATE 表示私有地址, PUBLIC 表示公有地址
int():返回IP地址的整数格式
>>> from IPy import IP
>>> ip = IP('10.0.0.1')
>>> ip.int()
167772161
strHex():返回IP地址的十六进制格式
>>> from IPy import IP
>>> ip = IP('10.0.0.1')
>>> ip.strHex()
'0xa000001'
strBin():返回IP地址的二进制格式
>>> from IPy import IP
>>> ip = IP('10.0.0.1')
>>> ip.strBin()
'00001010000000000000000000000001'
PS:在数据库中存储IP地址有两种形式:
- 以变长字符串的形式将IP地址保存在数据库中
- 将IP地址转换为整数以后保存到数据库中
转换成整数后进行存储可以有效的节省存储空间,提高数据库的存储效率和访问速度,所以在最佳实践中,一般将IP地址以数字的形式保存到数据库中。当需要IP地址时,我们再对整数的IP地址进行转换即可。
mysql本身也提供了IP地址到证书的转换函数:
mysql> select inet_aton('10.0.0.1')
-> ;
+-----------------------+
| inet_aton('10.0.0.1') |
+-----------------------+
| 167772161 |
+-----------------------+
1 row in set (0.00 sec)
mysql> select inet_ntoa('167772161');
+------------------------+
| inet_ntoa('167772161') |
+------------------------+
| 10.0.0.1 |
+------------------------+
1 row in set (0.00 sec)
mysql>
而在Python中,通过int方法就可以进行转换
>>> from IPy import IP
>>> ip = IP('167772161')
>>> ip
IP('10.0.0.1')
>>> # 转换成数字使用 int方法 即可
网段管理
IP类的构造函数可以接受多种类型的IP地址或者是一个网段格式。
>>> from IPy import IP
>>> IP('172.16.0.0/16')
IP('172.16.0.0/16')
>>> IP('172.16.0.0-172.31.255.255')
IP('172.16.0.0/12')
>>> IP('10.0.0.0/255.0.0.0')
IP('10.0.0.0/8')
>>> # 当IP类的实例化参数是一个网段时,那么参数的主机地址必须为0,否则会提示IP地址前缀错误
对于包含多个IP地址的对象,我们可以调用len方法或者内置的len方法,求出IP地址的个数
>>> from IPy import IP
>>> ip = IP('10.0.0.0/255.0.0.0')
>>> ip.len()
16777216
>>> len(ip)
16777216
>>>
对于网段的地址,我们也可以利用for循环,得到其包涵的所有IP地址
>>> from IPy import IP
>>> ip = IP('10.0.0.0/30')
>>> for i in ip:
print(i) 10.0.0.0
10.0.0.1
10.0.0.2
10.0.0.3
>>>
针对不同的显示方式,还可以使用strNormal方法,该方法接受一个 wantprefixlen 参数,参数的合法取值为 0 - 3,每一个取值表示一种显示方式
>>> from IPy import IP
>>> ip = IP('10.0.0.0/30')
>>> ip.strNormal(0)
'10.0.0.0'
>>> ip.strNormal(1)
'10.0.0.0/30'
>>> ip.strNormal(2)
'10.0.0.0/255.255.255.252'
>>> ip.strNormal(3)
'10.0.0.0-10.0.0.3'
>>>
针对于网段而言,还可以获取其子网掩码,以及广播地址
>>> from IPy import IP
>>> ip = IP('10.0.0.0/30')
>>> ip.netmask()
IP('255.255.255.252')
>>> ip.broadcast()
IP('10.0.0.3')
>>>
还可以进行ip的判断,判断其是否属于一个网段中,又或者两个网段中是否重叠
>>> from IPy import IP
>>> IP('10.0.0.1') in IP('10.0.0.0/24')
True
>>> IP('192.168.0.1') in IP('10.0.0.0/24')
False
>>> IP('10.0.0.0/24').overlaps('192.168.0.0/24')
0
>>> IP('10.0.0.0/8').overlaps('10.0.0.0/16')
1
>>> # 0 表示不包涵,1表示包涵
Python模块学习 - IPy的更多相关文章
- 【目录】Python模块学习系列
目录:Python模块学习笔记 1.Python模块学习 - Paramiko - 主机管理 2.Python模块学习 - Fileinput - 读取文件 3.Python模块学习 - Confi ...
- 【转】Python模块学习 - fnmatch & glob
[转]Python模块学习 - fnmatch & glob 介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名的标准库. fnmatch模块 大部分情况下使用字符串匹配查找特 ...
- Python模块学习filecmp文件比较
Python模块学习filecmp文件比较 filecmp模块用于比较文件及文件夹的内容,它是一个轻量级的工具,使用非常简单.python标准库还提供了difflib模块用于比较文件的内容.关于dif ...
- python模块学习第 0000 题
将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果: 好可爱>%<! 题目来源:https://github.com/Yixiao ...
- Python模块学习:logging 日志记录
原文出处: DarkBull 许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net ...
- 解惑Python模块学习,该如何着手操作...
Python模块 晚上和朋友聊天,说到公司要求精兵计划,全员都要有编程能力.然后C.Java.Python-对于零基础入门的,当然是选择Python的人较多了.可朋友说他只是看了简单的语法,可pyth ...
- Python模块学习
6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...
- Python模块学习系列
python模块-time python模块-datetime python模块-OS模块详解
- Python模块学习遇到的问题
Python使用import导入模块时报ValueError: source code string cannot contain null bytes的解决方案 Python使用import导入模块 ...
随机推荐
- git & configs
git & configs https://alvinalexander.com/git/git-show-change-username-email-address https://stac ...
- 【.Net】在C#中判断某个类是否实现了某个接口
有时我们需要判断某个类是否实现了某个接口(Interface),比如在使用反射机制(Reflection)来查找特定类型的时候. 简单来说,可以使用Type.IsAssignableFrom方法: t ...
- springBoot定制内嵌的Tomcat
此篇仅介绍配置方式,详细配置内容百度查阅 工程结构: 可以通过配置的方式设置参数,如下 application.properties #配置tomcat端口 # server.port= 8888 # ...
- java 当读取的结果为-1时候说明已经读取结束了
当读取的结果为-1时候说明已经读取结束了
- iOS进阶--将项目的编译速度提高5倍
前言 作为开发团队的负责人,最近因为在快速迭代开发新功能,项目规模急速增长,单个端业务代码约23万行,私有库约6万行,第三方库代码约15万行,单个客户端的代码行数约60万.现在打包一次耗时需要11~1 ...
- FZU 1492 地震预测(链表)
实际上把数组排序一遍加入链表中,再记录好数组原来的数在链表中的位置.我们只需要维护链表的删除操作就可以了. # include <cstdio> # include <cstring ...
- 【bzoj3524】[Poi2014]Couriers 主席树
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...
- Codeforces Round #522 Div. 1 没打记
开场被A劝退,写了得有50min于是不敢交了.unrated了喜闻乐见. A:瞎猜都能猜到如果要走到那条直线上,进入直线的点横坐标或纵坐标与起点相同,离开直线的点横坐标或纵坐标与终点相同,证明脑补一下 ...
- Android 4.0源码结构
Android 4.0 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等 ...
- [BZOJ5463] [APIO2018] 铁人两项
题目链接 LOJ. BZOJ. Solution 先建圆方树. 我们考虑暴力,枚举一个点对,我们枚举的点都是圆点,然后统计中间那个点可以取的位置的数量,加起来就是答案. 那么怎么统计呢,我们对于每个点 ...