對獲取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。所以在比較時,需要將這段剔除,否則讀取的數值將會比原本的多很多。
代碼效果展示:
輸入文件內容(可以任意添加):
輸出文件獲取的內容: