zoukankan      html  css  js  c++  java
  • 20190127-将一个文件拆分为多个新文件

    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是否为空来判断是否要将最后的内容追加写到最后一个文件中

     

     

     

  • 相关阅读:
    八数码(BFS)
    食物链(并查集)
    最大异或对(Trie)
    解决espeak编译的一些问题
    AcWing 3779. 相等的和
    AcWing 3775. 数组补全(环图)
    AcWing 3728. 城市通电(最小生成树)
    AcWing 3727. 乘方相乘(进位制)
    tarjan
    LC刷题简要记录
  • 原文地址:https://www.cnblogs.com/hyj691001/p/10327969.html
Copyright © 2011-2022 走看看