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


Posted in Python onApril 20, 2021

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

方法一:

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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
解决pycharm无法识别本地site-packages的问题
Oct 13 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
django连接oracle时setting 配置方法
Aug 29 Python
python匿名函数lambda原理及实例解析
Feb 07 Python
解决springboot yml配置 logging.level 报错问题
Feb 21 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
如何将json数据转换为python数据
Sep 04 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 Python
详解Python如何批量采集京东商品数据流程
Jan 22 Python
Python绘制分类图的方法
Pytest allure 命令行参数的使用
在pyCharm中下载第三方库的方法
Python控制台输出俄罗斯方块移动和旋转功能
Apr 18 #Python
深入理解python多线程编程
Apr 18 #Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 #Python
python批量更改目录名/文件名的方法
Apr 18 #Python
You might like
php下批量挂马和批量清马代码
2011/02/27 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
php命令行写shell实例详解
2018/07/19 PHP
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
深入理解vue $refs的基本用法
2017/07/13 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
Python工程师面试必备25条知识点
2018/01/17 Python
python入门教程 python入门神图一张
2018/03/05 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
采购主管的岗位职责
2013/12/17 职场文书
教师党员一句话承诺
2014/03/28 职场文书
计生专干事迹
2014/05/28 职场文书
人力资源职位说明书
2014/07/29 职场文书
汽车转让协议书
2015/01/29 职场文书
五一劳动节慰问信
2015/02/14 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
赢在中国观后感
2015/06/02 职场文书
教师岗位说明书
2015/09/30 职场文书
2019财务转正述职报告
2019/06/27 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
mysql幻读详解实例以及解决办法
2022/06/16 MySQL