数据切割与归并排序

提取程序

先看需要提取的数据,将其切割,先需要做两件事,读取与写入文件,经历循环把每一个数据写入,写入完就关闭文件。

import os
'''
mystr="mishuai4023~|^mishuai4023@163.com~|^a918873cf55f44dd8fc1aafdad42ef78:zjliyr~|^112.238.125.43"
mylist=mystr.split("~|^")
print(mylist)
print(mylist[1])
'''
class GetMail:
    def __init__(self,inpath,outpath):#初始化,读写
        self.readfile=open(inpath,"r",errors="ignore")
        self.writefile=open(outpath,"w")
    def  getmail(self): #执行,
        while True:
            line =self.readfile.readline()
            if not line:
                break
            linelist=line.split("~|^")
            if  len(linelist)==4:
                if  linelist[1].find("@")!=-1:
                    self.writefile.write(linelist[1]+"\n")

    def __del__(self):#类死亡,关闭文件
        self.readfile.close()
        self.writefile.close()

path=r"Z:\D\第一阶段视频\20170626\yinchengDay4\机锋2300W完整版"
filelist=os.listdir(path) #listdir遍历一个文件夹下所有文件
print(filelist)
for filename  in filelist: #循环文件列表
    readpath=path+"\\"+filename
    savepath="C:\\Users\\Tsinghua-yincheng\\Desktop\\YinchengDay5\\mail\\"
    writepath=savepath+filename
    #print(readpath,writepath)
    mymail=GetMail( readpath, writepath)
    mymail.getmail()

如何批量合并

合并的关键是把读取到的数据写入指定地址

'''
import os
savepath="C:\\Users\\Tsinghua-yincheng\\Desktop\\YinchengDay5\\mail\\"
mylist=os.listdir(savepath) #遍历目录
print(mylist)
'''
import os

class  MergeFile:
    def __init__(self,pathdir,outpath):
        self.writefile=open(outpath,"w")#写入归并的文件
        self.readfilelist=[]
        self.filenamelist=os.listdir(pathdir)#获取文件列表
        for  filename in self.filenamelist:
            filepath=pathdir+"\\"+filename #抓取绝对路径
            readfile=open(filepath,"r",errors="ignore")#读取文件的对象
            self.readfilelist.append(readfile)#加入一个文件对象
    def  merge(self):
        for  readfile  in  self.readfilelist:
            while True:
                line= readfile.readline()
                if not line:
                    break
                self.writefile.write(line)#写入
    def  __del__(self):
        self.writefile.close()#关闭
        for readfile in self.readfilelist:
            readfile.close()#关闭


'''
savepathdir="C:\\Users\\Tsinghua-yincheng\\Desktop\\YinchengDay5\\mail\\"
outpath="C:\\Users\\Tsinghua-yincheng\\Desktop\\YinchengDay5\\mail.txt"
mailmerge=MergeFile(savepathdir,outpath)
mailmerge.merge()

savepathdir="Z:\\D\\第一阶段视频\\20170626\\yinchengDay4\\机锋2300W完整版"
outpath="C:\\Users\\Tsinghua-yincheng\\Desktop\\YinchengDay5\\jiphone.txt"
mailmerge=MergeFile(savepathdir,outpath)
mailmerge.merge()
'''


savepathdir=r"C:\Users\Tsinghua-yincheng\Desktop\YinchengDay5\merge"
outpath="C:\\Users\\Tsinghua-yincheng\\Desktop\\YinchengDay5\\12.txt"
mailmerge=MergeFile(savepathdir,outpath)
mailmerge.merge()


均等切割

均等切割对输入的一个数我们进行切割,如果正好整除就均等切分,有余数就先用这个数减去余数后再除以需要的切割数减一,这样剩下的就是最后一个数

'''

num=eval(input("输入总量"))
N=eval(input("要切割的数量"))
lastlist=[]
if  num %N==0: #可以整除
    for  i  in range(N):
        lastlist.append(num//N)
else:#不可以整除
    if  num%(N-1)==0:
        for  i in range(N-2):
            lastlist.append(num//(N-2))
        lastlist.append((num%(N-2))//2)
        lastlist.append((num % (N - 2))-(num%(N-2))//2)
    else:
        for  i in range(N-1):
            lastlist.append(num//(N-1))
        lastlist.append(num%(N-1))
print(lastlist)

'''


def evgSplit(sum1, N):
    list1 = []
    if sum1 % N == 0:
        for i in range(N):
            list1.append(sum1 // N)
    else:
        #99 -99%10=90//9=10
        evg = (sum1 - sum1 % N) // (N - 1) #10
        for i in range(N - 1):
            list1.append(evg)
            sum1 -= evg
        list1.append(sum1)
    return list1


#sum1 = eval(input("请输入总数:"))
#N = eval(input("请输入份数:"))
print(evgSplit(100, 10))
print(evgSplit(99, 10))
print(evgSplit(101, 10))
print(evgSplit(91, 10))

数据切割

对于数据而言也是类似不过思维过程需要一步一步来,显示明确输入输出的文件路径,并且需要保存到那一个文件夹中,写入我们的切割方法,计算切割的行数,调用切割方法进行切割,最后再下一个关闭读取与写入,最后主函数写我们需要的参数。

class Cutfile:
    #明确输入输出,输入N切割的份数,输入切割文件路径,切割好的文件保存到一个文件夹
    def __init__(self,N,readfilepath,outdir):
        self.readfile=open(readfilepath,"r",errors="ignore")#打开要切割的文件
        self.N=N #切割的份数
        self.allnum=self.getlines() #一共多少行,总量


        self.cutnumlist=self.evgSplit( self.allnum, self.N)#均等切割
        #[10,10,9]  #每个文件得到多少

        self.writelist=[]  #文件列表
        for  i  in range(self.N):
            outpath=outdir+"\\"+str(i+1)+".txt" #切割的N个文件设置好路径
            file=open( outpath,"w")
            self.writelist.append(file)

    def evgSplit(self,sum1, N): #切割的方法
        list1 = []
        if sum1 % N == 0:
            for i in range(N):
                list1.append(sum1 // N)
        else:
            # 99 -99%10=90//9=10
            evg = (sum1 - sum1 % N) // (N - 1)  # 10
            for i in range(N - 1):
                list1.append(evg)
                sum1 -= evg
            list1.append(sum1)
        return list1

    def  getlines(self): #一共多少行
        length=0  #长度0
        while True:
            line=self.readfile.readline()
            if not line: #读到最后跳出循环,否则行数+1继续读
                break
            else:
                length+=1
        self.readfile.seek(0,0)#文件回到开头
        return length

    def cut(self):
        print("开始切割")
        #[10, 10, 10, 10, 10, 10, 10, 10, 10, 1]
        for  i   in   range(len(self.cutnumlist)):
            for  j  in range(self.cutnumlist[i]):
                line=self.readfile.readline()
                self.writelist[i].write( line)
            #self.writelist[i]写入那个文件
            #self.cutnumlist[i]写入多少行



    def __del__(self):
        self.readfile.close()#关闭读取
        for file in self.writelist: #关闭写入
            file.close()




readfilepath=r"C:\Users\Tsinghua-yincheng\Desktop\YinchengDay5\jiphone.txt"
savedir=r"C:\Users\Tsinghua-yincheng\Desktop\YinchengDay5\cutphone"
N=39
mycut=Cutfile(N,readfilepath,savedir)
mycut.cut()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青灯有味是儿时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值