引言

做项目的时候经常会碰到一堆IP列表,像这样

乍一看还很正常,但是这个

111.75.193.31-111.75.193.31

是个什么东西???

强迫症果断不能忍啊,你为什么要写成段的形式?而且这个列表肯定还有重复的

让我们用Pyhon来分解去重一下

百度一下

网上已经有大佬写出来的,

python 对ip段处理 - 阿毛小猪 - 博客园

不过我看得头大,有没有现成的库可以用呢?

IPy

百度了一下基本上处理IP都是使用IPy的库

让我们来看看

IP段转换为CIDR格式:

print (IP('192.168.1.0-192.168.1.255',make_net=True))

分解CIDR格式:

ip=IP('192.168.0.0/28')
for x in ip:
    print x

看起来不错

让我来试试

???

好像对CIDR格式有要求,不规则的段/CIDR都不能正确转换

群里问了一下大佬,发现netaddr这个库,百度一下好像资料比IPy少

##netaddr##
使用非常简单 netaddr.iprange_to_cidrs(startip, endip)即可

startip = '1.1.1.1'
endip = '255.255.255.255'
cidrs = netaddr.iprange_to_cidrs(startip, endip)
for i in enumerate(cidrs):
    print i

这样就可以输出全网IP

对于CIDR格式,有IPNetwork()方法

for j in IPNetwork('192.168.1.0/24') :
                print j

这样就输出了192.168.1.0整个C段的IP

最终代码

import netaddr
from netaddr import IPNetwork
import sys

def showIP(**args):
    if len(args)==2:
        cidrs = netaddr.iprange_to_cidrs(args['startip'], args['endip'])
        for i in cidrs:
            for j in IPNetwork(i) :
                print j
    else:
        for j in IPNetwork(args['only']) :
            print j


if __name__ == '__main__':
    with open(sys.argv[1],'r') as f:
        for i in f.readlines():
            i=i.strip()
            if '-' in i:
                showIP(startip=i.split('-')[0],endip=i.split('-')[1])
            elif '/' in i:
                showIP(only=i.strip())
            else:
                print i

按列读TXT文件,是IP段格式或CIDR格式就分解,否则输出

也可以直接转换成CIDR格式,简单改一下即可