本文介绍一种将一个大的文本文件分割成多个小文件的方法
方法一:
1.读取文章所有的行,并存入列表中
2.定义分割成的小文本的行数
3.将原文本内容按一定行数依次写入小文件中
4.此方法对较小的大文件比较适合
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#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()
|
方法二:
依次读取指定行数的数据,并写入新的文件中,对于较大文件,采用此方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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中是完整的记录,判断方法见代码
方法三:基于大小分割
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# -*- 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)
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/d1240673769/article/details/77513091