python IP 处理模块IPy

最近做项目需要处理ip相关内容,由于c语言处理ip字符串需要自己检查相关的格式,故选择python类库IPy 。


一、安装

安装easy_install :
yum -y install python-setuptools
安装:
easy_install IPy
或者yum -y install python-IPy
-----------------------------------------------------------我是分割线---------------------------------------------------

下载地址


安装
引用

tar -zxvf IPy-0.42.tar.gz
cd IPy-0.42
python setup.py install


---------------------------------------------------------------我是分割线------------------------------------------

二、使用

API
=======================

IPy库包含类IP,使用它你可以方便处理对大部分格式的ipv6和ipv4网络
和地址的格式化和处理。它的接口借鉴了Perl的NET::IP模块,但是实现上
采用了不同的方法。它没有实现non-CIDR网络掩码,所以打算使用0xffffff0f
格式网络掩码的无法使用。

    >>> from IPy import IP
    >>> ip = IP('127.0.0.0/30')
    >>> for x in ip:
    ...  print(x)
    ...
    127.0.0.0
    127.0.0.1
    127.0.0.2
    127.0.0.3
    >>> ip2 = IP('0x7f000000/30')
    >>> ip == ip2
    1
    >>> ip.reverseNames()
    ['0.0.0.127.in-addr.arpa.', '1.0.0.127.in-addr.arpa.', '2.0.0.127.in-addr.arpa.', '3.0.0.127.in-addr.arpa.']
    >>> ip.reverseName()
    '0-3.0.0.127.in-addr.arpa.'
    >>> ip.iptype()
    'PRIVATE'

支持大部分IP地址格式
================================

它可以检测各种各样的ip地址和网络的格式,格式化他们并且区分他们是ipv4还是
ipv6地址:

    >>> IP('10.0.0.0/8').version()
    4
    >>> IP('::1').version()
    6

IPv4地址
--------------

    >>> print(IP(0x7f000001))
    127.0.0.1
    >>> print(IP('0x7f000001'))
    127.0.0.1
    >>> print(IP('127.0.0.1'))
    127.0.0.1
    >>> print(IP('10'))
    10.0.0.0

IPv6地址
--------------

    >>> print(IP('1080:0:0:0:8:800:200C:417A'))
    1080::8:800:200c:417a
    >>> print(IP('1080::8:800:200C:417A'))
    1080::8:800:200c:417a
    >>> print(IP('::1'))
    ::1
    >>> print(IP('::13.1.68.3'))
    ::d01:4403

网络掩码和前缀
-------------------------

    >>> print(IP('127.0.0.0/8'))
    127.0.0.0/8
    >>> print(IP('127.0.0.0/255.0.0.0'))
    127.0.0.0/8
    >>> print(IP('127.0.0.0-127.255.255.255'))
    127.0.0.0/8

推导网络地址
===========================

IPy可以通过使用一个网络掩码将一个IP地址转化为网络地址:
>>> print(IP('127.0.0.1/255.0.0.0', make_net=True))
127.0.0.0/8

也可以直接操作一个IP对象:
>>> print(IP('127.0.0.1').make_net('255.0.0.0'))
127.0.0.0/8

将地址转化成字符串
=========================

基本上所有的返回一个字符串的类方法都会有一个可选参数'wantprefixlen',
它用来控制是否打印前缀或者网络掩码。如果网络地址包含多个地址,那么默认情况下
总会显示前缀的:

    wantprefixlen == 0 / None     don't return anything   1.2.3.0
    wantprefixlen == 1            /prefix                 1.2.3.0/24
    wantprefixlen == 2            /netmask                1.2.3.0/255.255.255.0
    wantprefixlen == 3            -lastip                 1.2.3.0-1.2.3.255

你可以通过改变下面这些对象属性来改变默认行为:


 * NoPrefixForSingleIp
 * WantPrefixLen

字符串转化例子:

    >>> IP('10.0.0.0/32').strNormal()
    '10.0.0.0'
    >>> IP('10.0.0.0/24').strNormal()
    '10.0.0.0/24'
    >>> IP('10.0.0.0/24').strNormal(0)
    '10.0.0.0'
    >>> IP('10.0.0.0/24').strNormal(1)
    '10.0.0.0/24'
    >>> IP('10.0.0.0/24').strNormal(2)
    '10.0.0.0/255.255.255.0'
    >>> IP('10.0.0.0/24').strNormal(3)
    '10.0.0.0-10.0.0.255'
    >>> ip = IP('10.0.0.0')
    >>> print(ip)
    10.0.0.0
    >>> ip.NoPrefixForSingleIp = None
    >>> print(ip)
    10.0.0.0/32
    >>> ip.WantPrefixLen = 3
    >>> print(ip)
    10.0.0.0-10.0.0.0

处理多个网络地址
===========================

只是简单的添加一个相邻的网络地址块可以聚集成一个包含两个网络地址块的网络地址,
但是要想处理更加复杂的网络地址聚集和映射情况,可以使用IPSet类,它可以保存任意
个网络地址块.

    >>> from IPy import IP, IPSet
    >>> IP('10.0.0.0/22') - IP('10.0.2.0/24')
    IPSet([IP('10.0.0.0/23'), IP('10.0.3.0/24')])
    >>> IPSet([IP('10.0.0.0/23'), IP('10.0.3.0/24'), IP('10.0.2.0/24')])
    IPSet([IP('10.0.0.0/22')])
    >>> s = IPSet([IP('10.0.0.0/22')])
    >>> s.add(IP('192.168.1.0/29'))
    >>> s
    IPSet([IP('10.0.0.0/22'), IP('192.168.1.0/29')])
    >>> s.discard(IP('192.168.1.2'))
    >>> s
    IPSet([IP('10.0.0.0/22'), IP('192.168.1.0/31'), IP('192.168.1.3'), IP('192.168.1.4/30')])

兼容性和一些链接
=======================

IPy 0.82兼容Python 2.6 - 3.3版本.

如何不是用减法,IP模块也可以在python2.5中使用,IPSet需要使用python2.6中的collections
模块。
三、实例

#!/usr/bin/python
#_*_encoding:utf-8_*_
import sys
import re
from IPy import IP

IP_PATH = "/data/conf/ip_list.conf" 

def is_innet(ip):
        if re.match('^((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))$', ip) == None:
                                print 'status=-1,IP error!'
                                return -1
  
        myfile = open(IP_PATH, 'r')   
        line = myfile.readline()
        while line: 
                status =  ip in IP(line)
                if status == True:
                        return 0
                line = myfile.readline()  
        myfile.close() 
        return -1

def hello(str):
        print "hello",str
        return 0

if __name__ == "__main__":
        status = is_innet("172.16.1.28")
        print status


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值