对获取IP具体地址的修改。原地址:https://blog.csdn.net/Amdy_amdy/article/details/87870018
本次修改后,支持获取的地址段类型有:
1.1.1.1/24等B C段
1.1.1.*等B C段
1.1.1.1-255
1.1.1.1-1.1.3.255(原来代码所支持的地址段)
欢迎交流,代码自取。
"""
======================
@Auther:CacheYu
@Time:2019/10/29 下午
======================
"""
#!/usr/bin/python
#coding:utf-8
import os
import sys
# from IPy import IP
inputfile=open("./1.txt","r")
outputfile=open("./ip.txt",'w') #w表示复盖,a+表示追加
#B、C段的地址以单个的形式表现-输入为/
def ipCS(line):
ips = str(line).split('/')
ips1 = str(ips[0]).split('.')
ips2 = int(ips[1])
if ips2 in range(24,32):
s = 32-int(ips[1])
for x in range(0,2**s-2):#输入的标准是1.1.1.1/24;如果输入的是1.1.1.0/24,则会多出来一个掩码
iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(ips1[2])+'.'+str(int(ips1[3])+x)
print >> outputfile,"%s" %iplist
if ips2 in range(16,24):
s = 24-int(ips[1])
for x in range(0,2**s):
iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(int(ips1[2])+x)+'.'+str(ips1[3])+'/24'
ipCS(iplist)#递归调用,代码复用
if ips2 in range(8,16):
s = 16-int(ips[1])
for x in range(0,2**s):
iplist = str(ips1[0])+'.'+str(int(ips1[1])+x)+'.'+str(ips1[2])+'.'+str(ips1[3])+'/16'
ipCS(iplist)
#B、C段的地址以单个的形式表现-输入为*
def ipC_S(line):
count = line.count('*')
print(count)
ips = line.split('.')
while count == 0:
break
while count == 1:
for i in range(0,255):
iplist = str(ips[0])+'.'+str(ips[1])+'.'+str(ips[2])+'.'+str(i)
print >> outputfile,"%s" %iplist
break
while count == 2:
for i in range(0,256):
iplist = str(ips[0])+'.'+str(ips[1])+'.'+str(i)+'.*'
ipC_S(iplist)#递归调用,代码复用
break
while count == 3:
for i in range(0,256):
iplist = str(ips[0])+'.'+str(i)+'.*.*'
ipC_S(iplist)#递归调用,代码复用
break
#IP以单个形式表现,输入为-
def ipS(line):
ips = str(line).split("-")
ips1 = str(ips[0]).split(".")
if(len(ips[1])>=4):
ips2 = str(ips[1]).split(".")
if(ips1[0]==ips2[0] and ips1[1]==ips2[1] and ips1[2]==ips2[2]):
for j in range(int(ips1[3]),int(ips2[3])+1):
iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(ips1[2])+'.'+str(j)
print >> outputfile,"%s" %iplist
else:
for j in range(int(ips1[3]),256):
iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(ips1[2])+'.'+str(j)
print >> outputfile,"%s" %iplist
for i in range(int(ips1[2])+1,int(ips2[2])):
for j in range(0,256):
iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(i)+'.'+str(j)
print >> outputfile,"%s" %iplist
for j in range(0,int(ips2[3])):
iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(ips2[2])+'.'+str(j)
print >> outputfile,"%s" %iplist
else:
ips2 = int(ips[1])
for j in range(int(ips1[3]),ips2+1):
iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(ips1[2])+'.'+str(j)
print >> outputfile,"%s" %iplist
if __name__ == '__main__':
lines=inputfile.readlines()
iplist = ""
for line in lines:
if '\xef\xbb\xbf' in line:#引用codecs模块,来判断前三个字节是否为BOM_UTF8。如果是,则剔除\xef\xbb\xbf字节。
line = line.replace('\xef\xbb\xbf','')
if '-' in line:
ipS(line)
if '/' in line:
ipCS(line)
if '*' in line:
ipC_S(line)
inputfile.close()
outputfile.close()
原来的代码被封装在了ipS(line)函数内,进行了部分修改。修改的主要原因是之前写的过程中,忽略了python在读取txt的时候,python的file对象的readline以及readlines程序中,针对一些UTF-8编码的文件,开头会加入BOM来表明编码方式。也就是添加上\xef\xbb\xbf。所以在比较时,需要将这段剔除,否则读取的数值将会比原本的多很多。
代码效果展示:
输入文件内容(可以任意添加):
输出文件获取的内容: