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提取Linux内核源代码的目录结构实现方法
Jun 24 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
python自动化报告的输出用例详解
May 30 Python
python pandas模块基础学习详解
Jul 03 Python
python 多维高斯分布数据生成方式
Dec 09 Python
python实现视频读取和转化图片
Dec 10 Python
python tkinter之 复选、文本、下拉的实现
Mar 04 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 Python
pytorch 中autograd.grad()函数的用法说明
May 12 Python
pytorch--之halfTensor的使用详解
May 24 Python
用Python实现一个打字速度测试工具来测试你的手速
May 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类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
canvas知识总结
2017/01/25 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
Python 列表(List)操作方法详解
2014/03/11 Python
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
Python部署web开发程序的几种方法
2017/05/05 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
纯CSS3实现运行时钟的示例代码
2021/01/25 HTML / CSS
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
数字漫画:comiXology
2020/06/13 全球购物
个人作风剖析材料
2014/02/02 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
婚礼长辈答谢词
2015/09/29 职场文书