从数据中提取这些数字,判断是否存在连续:如果连续,那么根据格式化输出要求,startNum为连续数字的头,endNum为连续数字的尾部;如果不连续,那么startNum和endNum均为为当前数字本身,最终实现格式化打印或者写入一个文件两种不同的输出模式,id从10000开始计算。
原始数据:
“123456789” “123456790” “123452789” “123453789” “123456792” “123456793” “123456794” “123456799” ...
期望输出:
当前id为:10000, startNum:123456789, endNum:123456790 当前id为:10001, startNum:123452789, endNum:123452789 当前id为:10002, startNum:123453789, endNum:123453789 当前id为:10003, startNum:123456792, endNum:123456794 当前id为:10004, startNum:123456799, endNum:123456799实现思路:
- 从文件中读取数据,并且提取数据中的数字部分存放在一个数组里面构建一个二维数组,将提取的数字判断是否有连续的,如果有就将连续的数字作为一个一维数组存放入二维数组;如果没有就单独作为一个一维数组存入;
输出格式如下: [[123456789, 123456790], [123452789], [123453789], [123456792, 123456793, 123456794], [123456799]]
- 根据输出要求,判断二维数组的长度来确定需要填入的头部数字和尾部数字是否一致,最终实现格式化输出
# python 3.7实现
import os
import re
class ExtractNumberInfo():
def __init__(self):
self.current_path = os.getcwd()
# ======此处修改输入输出文件名称=======================
self.outputFileName = "text2.txt"
self.readFileName = "text.txt"
# =================================================
self.id = 9999
self.read_nums=[]
self.before_nums=[]
self.string=''
# 检查是否存在输出文件,如果存在就删除
def checkFile(self):
file_path = self.current_path+"\"+self.outputFileName
if os.path.exists(file_path):
os.remove(file_path)
# 读取数据
def readFile(self):
f = open(self.readFileName,'r',encoding="utf8")
count=0
for line in f.readlines():
count+=1
line = line.strip('n')
num = re.findall('d+',line)
if len(num) !=0:
self.read_nums.append(int(num[0]))
else:
print("存在空行,在第"+str(count)+"行,我已经删除了.")
continue
f.close()
# 提取数组中连续的数字形成新的数组
def extractContinuousNumbers(self):
i=0
tempOne=[]
for index in range(len(self.read_nums)):
result = int(self.read_nums[index])
if(i == result ):
tempOne.append(i)
i+=1
continue
if(len(tempOne)>1):
self.before_nums.pop(-1)
self.before_nums.append(tempOne)
tempOne=[result ]
i=int(result )+1
self.before_nums.append(tempOne)
def outputFile(self):
for i in range(len(self.before_nums)):
self.id +=1
temp=self.before_nums[i]
if(len(temp)>1):
prev=temp[0]
last=temp[-1]
#print("prev:"+str(prev)+", last:"+str(last))
self.outPutFormatString(prev,last)
else:
prev=temp[0]
self.outPutFormatString(prev,prev)
self.outPutModel(self.flag)
def outPutFormatString(self,prev,last):
# ======此处修改输出格式化语句=======================
tempString="当前id为:"+str(self.id)+", startNum:"+str(prev)+", endNum:"+str(last)
# ====================================================
if self.flag:
self.string=tempString+"n"
else:
self.string=tempString
def outPutModel(self,flag):
if flag:
with open(self.outputFileName,'a',encoding='utf8') as w:
w.write(self.string)
else:
print(self.string)
def run(self,flag):
self.flag = flag
self.checkFile()
self.readFile()
self.extractContinuousNumbers()
self.outputFile()
print("执行完成!")
if __name__ == '__main__':
app = ExtractNumberInfo()
# flag表示输出数据模式,True表示写入文件,False表示命令行输出,在此处修改即可。
app.run(False)
注意事项:
flag表示输出数据模式,True表示写入文件,False表示命令行输出,需要在调用的时候传入。格式化的输出字符串在写入文件的时候已经默认添加了,因此不需要再单独加“n”符号格式化字符串如果需要添加引号这些特殊符号,需要添加反斜杠进行转义连续的数组会只打印一个id号,id自动向前累计



