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 相关文章推荐
在Django框架中伪造捕捉到的URLconf值的方法
Jul 18 Python
windows下ipython的安装与使用详解
Oct 20 Python
python获取当前目录路径和上级路径的实例
Apr 26 Python
简单了解python gevent 协程使用及作用
Jul 22 Python
python获取网络图片方法及整理过程详解
Dec 20 Python
Jupyter打开图形界面并画出正弦函数图像实例
Apr 24 Python
通过Python实现一个简单的html页面
May 16 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 Python
用python对oracle进行简单性能测试
Dec 05 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
使用OpenCV实现人脸图像卡通化的示例代码
Jan 15 Python
解决pytorch下出现multi-target not supported at的一种可能原因
Feb 06 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常用字符串处理函数实例分析
2014/11/22 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
jQuery function的正确书写方法
2013/08/02 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
大学生实习思想汇报
2014/01/12 职场文书
运动会入场词60字
2014/02/15 职场文书
音乐教学随笔感言
2014/02/19 职场文书
股东协议书范本
2014/04/14 职场文书
白血病捐款倡议书
2014/05/14 职场文书
爱心捐助倡议书
2014/05/19 职场文书
关爱老人标语
2014/06/21 职场文书
先进工作者事迹材料
2014/12/23 职场文书
武夷山导游词
2015/02/03 职场文书
2015年度企业工作总结
2015/05/21 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
Mysql 如何查询时间段交集
2021/06/08 MySQL
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript