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读取键盘输入的2种方法
Jun 16 Python
Python制作简单的网页爬虫
Nov 22 Python
微信 用脚本查看是否被微信好友删除
Oct 28 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
python 检查文件mime类型的方法
Dec 08 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
Python之指数与E记法的区别详解
Nov 21 Python
Python中Flask-RESTful编写API接口(小白入门)
Dec 11 Python
python实现简单井字棋游戏
Mar 04 Python
Python使用Turtle模块绘制国旗的方法示例
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中is_file不能替代file_exists的理由
2014/03/04 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
英文版销售经理个人求职信
2013/11/20 职场文书
2014年采购员工作总结
2014/11/18 职场文书
电气工程师岗位职责
2015/02/12 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang
python使用torch随机初始化参数
2022/03/22 Python