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 面向对象 成员的访问约束
Dec 23 Python
在Python中使用列表生成式的教程
Apr 27 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
使用Python从有道词典网页获取单词翻译
Jul 03 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
python对于requests的封装方法详解
Jan 03 Python
python对象与json相互转换的方法
May 07 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
Jun 19 Python
利用Python校准本地时间的方法教程
Oct 31 Python
通过实例解析Python调用json模块
Dec 11 Python
如何使用repr调试python程序
Feb 28 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 类相关函数的使用详解
2013/05/10 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
php计算一个文件大小的方法
2015/03/30 PHP
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
微信小程序实现拼图小游戏
2020/10/22 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
python脚本实现查找webshell的方法
2014/07/31 Python
Python选课系统开发程序
2016/09/02 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
python3中布局背景颜色代码分析
2020/12/01 Python
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
Java基础面试题
2014/07/19 面试题
《从现在开始》教学反思
2014/04/15 职场文书
建材投资建议书
2014/05/16 职场文书
应届大学生求职信
2014/07/20 职场文书
个人收入证明模板
2014/09/18 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
社区党建工作总结2015
2015/05/13 职场文书
Vue+Flask实现图片传输功能
2022/04/01 Vue.js