当前位置 博文首页 > python实现大文本文件分割成多个小文件

    python实现大文本文件分割成多个小文件

    作者:Jepson2017 时间:2021-07-03 18:37

    本文介绍一种将一个大的文本文件分割成多个小文件的方法

    方法一:

    1.读取文章所有的行,并存入列表中
    2.定义分割成的小文本的行数
    3.将原文本内容按一定行数依次写入小文件中
    4.此方法对较小的大文件比较适合

    代码:

    #coding:utf-8
    #将大文本文件分割成多个小文本文件
    import os
    
    sourceFileName = "test.log" #定义要分割的文件
    def cutFile():
        print("正在读取文件...")
        sourceFileData = open(sourceFileName,'r',encoding='utf-8')
        ListOfLine = sourceFileData.read().splitlines()#将读取的文件内容按行分割,然后存到一个列表中
        n = len(ListOfLine)
        print("文件共有"+str(n)+"行")
        print("请输入需要将文件分割的个数:")
        m = int(input("")) #定义分割的文件个数
        p = n//m + 1
        print("需要将文件分成"+str(m)+"个子文件")
        print("每个文件最多有"+str(p)+"行")
        print("开始进行分割···")
        for i in range(m):
            print("正在生成第"+str(i+1)+"个子文件")
            destFileName = os.path.splitext(sourceFileName)[0]+"_part"+str(i)+".log" #定义分割后新生成的文件
            destFileData = open(destFileName,"w",encoding='utf-8')
            if(i==m-1):
                for line in ListOfLine[i*p:]:
                    destFileData.write(line+'\n')
            else:
                for line in ListOfLine[i*p:(i+1)*p]:
                    destFileData.write(line+'\n')
            destFileData.close()
        print("分割完成")
    
    cutFile()

    方法二:

    依次读取指定行数的数据,并写入新的文件中,对于较大文件,采用此方法

    import os
    
    #要分割的文件 
    source_file='track.log'
    
    #定义每个子文件的行数
    file_count=10000 #根据需要自定义
    
    def mk_SubFile(lines,srcName,sub):
        [des_filename, extname] = os.path.splitext(srcName)
        filename  = des_filename + '_' + str(sub) + extname
        print( '正在生成子文件: %s' %filename)
        with open(filename,'wb') as fout:
            fout.writelines(lines)
            return sub + 1
    
    
    def split_By_LineCount(filename,count):
        with open(filename,'rb') as fin:
            buf = []
            sub = 1
            for line in fin:
                if len(line.strip())>0: #跳过空行
                    buf.append(line)
                    #如果行数超过指定的数,且数据为一个完整的记录,则将buf写入到一个子文件中,并初始化buf
                    line_tag=line.strip()[0] #取每一行第一个字符,如果该行为空,会报错,故加上前面判断
                    if len(buf) >= count and line_tag == '*': #每一个新的记录数据是从*标识开始
                        buf = buf[:-1]
                        sub = mk_SubFile(buf,filename,sub) #将buf写入子文件中
                        buf = [line] #初始化下一个子文件的buf,第一行为*开头的
                    
            #最后一个文件,文件行数可能不足指定的数
            if len(buf) != 0:
                sub = mk_SubFile(buf,filename,sub)
        print("ok")
    
    
    if __name__ == '__main__':
        split_By_LineCount(source_file,file_count)#要分割的文件名和每个子文件的行数

    方法二中日志格式如下:

    每一条完整的是记录是以*号开头,为了在子文件中不出现被截断的数据记录,因此需要确保每一个buf中是完整的记录,判断方法见代码

    方法三:基于大小分割

    # -*- coding: utf-8 -*-
    
    #这种方法是按照大小分割文件,会存在同一行被分割在两个文件中的情况
    
    import os
    
    filename = "track.log"#需要进行分割的文件
    size = 10000000 #分割大小10M
    
    def mk_SubFile(srcName,sub,buf):
        [des_filename, extname] = os.path.splitext(srcName)
        filename  = des_filename + '_' + str(sub) + extname
        print( '正在生成子文件: %s' %filename)
        with open(filename,'wb') as fout:
            fout.write(buf)
            return sub+1
                
                
    def split_By_size(filename,size):
        with open(filename,'rb') as fin:
            buf = fin.read(size)
            sub = 1
            while len(buf)>0:
                sub = mk_SubFile(filename,sub,buf)
                buf = fin.read(size)  
        print("ok")
                
    
    if __name__=="__main__":
        split_By_size(filename, size)
    jsjbwy
    下一篇:没有了