一、前言
这是使用python写的根据文件行数切割文件的函数,实测速度尚可,在源文件大概200w、新文件20w的情况下测试了5个源文件,用时14s,基本满足笔者需要,因此没有继续进行优化,设想的优化思路包括使用多线程等,需要读者去完善。。
二、主要实现思路
找到源文件目录,利用一个大循环逐个向后推进。大循环内有两个小循环:
1、第一个小循环用于填充列表,使其达到新文件个数要求,一旦个数达到,则进入下一个小循环;
2、第二个小循环用于将每新文件个数的内容写入到新目录下的新文件,不满足个数则进行下一次大循环。
3、最终列表中剩下的内容写到一个新文件中。
三、实现代码
import os
import time
def cut_files(Filepath,new_Filepath,new_file_size):
pathDir=os.listdir(Filepath)#找到文件路径
list_ips=[]
file_index,new_file_index=0,0
l=len(pathDir)
#大循环,负责向后推进文件个数
while(file_index<l):
#第一个小循环,负责将列表长度填充到new_file_size之上
while(len(list_ips)<new_file_size and file_index<l):
filepath=Filepath+pathDir[file_index]
file_index+=1
f=open(filepath,"r+")
for line in f:
list_ips.append(line[:-1])
f.close()
#对于此时列表,每new_file_size个内容写到一个文件中,剩余的进入下一次填充
while(len(list_ips)>=new_file_size):
f=open(new_Filepath+str(format(new_file_index,'05.0f'))+".txt","w")
for ip in list_ips[0:new_file_size]:
f.write(ip+"\n")
f.close()
list_ips=list_ips[new_file_size:]
new_file_index+=1
#最终列表中剩余的内容写到最后一个新文件中
f=open(new_Filepath+str(format(new_file_index,'05.0f'))+".txt","w")
for ip in list_ips:
f.write(ip+"\n")
f.close()
if __name__=="__main__":
#源文件目录
Filepath="F:\\拼接测试文件夹\\"
#切割后文件存储目录
new_Filepath="F:\\最终地址\\"
#切割后每个文件大小
new_file_size=200000
t1=time.time()#计时开始
cut_files(Filepath,new_Filepath,new_file_size)
print("time:",time.time()-t1)#输出时间
其中输出格式使用了“format(new_file_index,‘05.0f’)”的方式,作用是使整数个数为5,小数个数为零,前面位数不够补零,使其最终达到格式化输出文件名的效果。