欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

20190127-将一个文件拆分为多个新文件

程序员文章站 2022-04-15 13:10:15
1.一个文件拆分成5个文件 思路: 1. 首先拆分成多个新文件,新的文件名需要定义,使用file_name_no来定义新文件的名字 2. 新文件的内容要使用file_content来存储,当写入新文件后使用file_contect=''清空新文件内容 3. 什么时候写新文件:考虑根据原始文件的内容做 ......

1.一个文件拆分成5个文件

思路:

1. 首先拆分成多个新文件,新的文件名需要定义,使用file_name_no来定义新文件的名字

2. 新文件的内容要使用file_content来存储,当写入新文件后使用file_contect=''清空新文件内容

3. 什么时候写新文件:考虑根据原始文件的内容做拆解,如将某文件拆分为5个文件,则原文件的行数除以5达到将原原件中的内容尽量平均的写入5个新文件中基于该情况,需要一个变量来统计原文件的行数,使用file_length存储原来文件的行数。然后再重新开始一行一行的读,当读取的行数达到1/5,2/5,3/5,4/5...的时候写文件

def split_file(file_dir,file_name,num):
    import os
    import os.path
    file_name_no=1
    file_content=''
    #print(type(os.path.splitext(file_name)))
    with open(file_dir+file_name,'r',encoding='utf-8') as fp1:
        file_length=len(fp1.readlines())
        #fp1.readlines()后,游标移到文件末尾,因此使用fp1.seek(0,0)将游标移到文件开始的位置
        print(file_length)
        fp1.seek(0,0)
        #使用fp1.seek(0,0)将游标移到文件开始的位置
        file_line=0
        #使用file_line记录已经读取的行数
        for line in fp1:
            file_content+=line
            file_line+=1
            if file_line==int(file_length/num)*file_name_no and file_name_no<num:
                #当读取的行数为达到文件内容的1/num,2/num...的时候,将文件内容写入新文件中,此写法如果文件行数/拆分个数为整数的时候刚好,否自会导致最后一个文件少内容
                with open(file_dir+'new'+os.path.splitext(file_name)[0]+str(file_name_no)+'.txt','w',encoding='utf-8') as fp2:
                    file_name_no+=1
                    fp2.write(file_content)
                    file_content=''
        if file_content:
            #解决因文件行数不一定拆分文件的整数倍导致最后一个文件可能少内容的情况
            with open(file_dir+'new'+os.path.splitext(file_name)[0]+str(num)+'.txt','a',encoding='utf-8') as fp2:
                fp2.write(file_content)            
split_file('d:\\python\\','b.txt',3)

 

 tips:file_dir为文件的路径,file_name为文件的名称,使用os.path.splitext(file_name)[0]获取原来文件名,使用file_dir+'new'+os.path.splitext(file_name)[0]+str(file_name_no)+'.txt'拼接新文件名。当一个文件写入后,file_name_no加1,file_content清空,最后根据file_content是否为空来判断是否要将最后的内容追加写到最后一个文件中