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深入学习之内存管理
Aug 31 Python
Python中获取对象信息的方法
Apr 27 Python
基于windows下pip安装python模块时报错总结
Jun 12 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
关于numpy数组轴的使用详解
Dec 05 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
Python文件操作基础流程解析
Mar 19 Python
解决导入django_filters不成功问题No module named 'django_filter'
Jul 15 Python
浅谈pandas dataframe对除数是零的处理
Jul 20 Python
Python关于拓扑排序知识点讲解
Jan 04 Python
Python绘制分类图的方法
Pytest allure 命令行参数的使用
在pyCharm中下载第三方库的方法
Python控制台输出俄罗斯方块移动和旋转功能
Apr 18 #Python
深入理解python多线程编程
Apr 18 #Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 #Python
python批量更改目录名/文件名的方法
Apr 18 #Python
You might like
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
JS类的封装及实现代码
2009/12/02 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
node.js操作mysql简单实例
2017/05/25 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
Python随机生成彩票号码的方法
2015/03/05 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
python批量解压zip文件的方法
2019/08/20 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
Python计算信息熵实例
2020/06/18 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
X/HTML5 和 XHTML2
2008/10/17 HTML / CSS
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
2014法制宣传日活动总结
2014/07/09 职场文书
县委务虚会发言材料
2014/10/20 职场文书
工程承包协议书
2014/10/20 职场文书
2015年科室工作总结
2015/04/10 职场文书
python pygame入门教程
2021/06/01 Python
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏