引言
做项目的时候经常会碰到一堆IP列表,像这样
乍一看还很正常,但是这个
111.75.193.31-111.75.193.31
是个什么东西???
强迫症果断不能忍啊,你为什么要写成段的形式?而且这个列表肯定还有重复的
让我们用Pyhon来分解去重一下
百度一下
网上已经有大佬写出来的,
不过我看得头大,有没有现成的库可以用呢?
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格式,简单改一下即可