Python处理单个大文本文件时可能耗时较长而且多线程对单个文件的操作也要处理死锁等,对文件进行分割然后对分割后的文件进行多进程+多线程分别处理是一个不错的思路。
文 章分割可以按体积分割,也可以按行进行分割,一般情况下按行分割能保证数据的完整性,所以本脚本以按行分割实现,运行时,被分割文件和脚本位于同一目录, 运行后先输入被分割的文件全名,然后输入分割的数量,再输入输出的文件前缀就可以了!因为时间仓促,还有几个小bug没有修改!
源代码:基于Python2.7,尽量不使用各种库
支持格式:txt sql json csv xml log等常见的有明显结构的文本文件
#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def get_file():#获取被分割的文件名,并验证是否合法
while(True):
f_name=raw_input('[ * ] Please input the filename to div: ')
if isinstance(f_name,str):
if f_name.find('.txt')>0 or f_name.find('.sql')>0 or f_name.find('.json')>0 or f_name.find('.csv')>0 or f_name.find('.xml')>0 or f_name.find('.log')>0:
return f_name
else:
print '[ * ]The format Error!!!'
pass
else:
print '[ * ]The format Error!!!'
pass
def get_int():#获取要分割成几份文件
while(True):
file_num=raw_input('[ * ] Please input numbers: ')
file_num=int(file_num)
if isinstance(file_num,int):
return file_num
else:
print '[ * ]The number Error!'
continue
def get_allines(file_name):#统计文本文件所有的行数
i=0
with open(file_name) as f:
for j in f:
i=i+1
return i
if __name__=='__main__':
print
print '------------------------------------------------'
print '[ * ] Filetype:txt sql csv xml json log'
print '------------------------------------------------'
print
file_to_div=get_file()
dot=file_to_div.find('.')
houzui=file_to_div[dot:]
outfile_name=raw_input('[ * ] Please input file-prifix: ')#获取输出文件的文件名前缀
num=get_int()
lines_num=get_allines(file_to_div)
print str(num)+' files ---',str(lines_num)+' lines per file'#打印
mid=lines_num/num#获取分割后每份文件应该多少行,因为整数除法所以输出的文件数目可能多一个,下行处理
mid=mid+1#为每个文件多加一行,防止输出的文件的数量多一个
i=0
with open(file_to_div) as file_hander:
for line in file_hander:
i=i+1
filename=outfile_name+str(i/mid+1)+houzui
with open(filename,'a') as wfile:
wfile.write(line)
print
print 'finished!!!'
使用示例:
step 1:输入被分割的文件名,如"mem.sql"
step 2:输入分割后的文件名的前缀,如"out"
step 3:输入分割的文件数目,如 4
补充:如果想利用本脚本处理其他格式的文本文件,可以在获取被分割的文件名函数里修改即可。
第一次发文章,路过的大神勿喷,Python学习交流使用,方便大家以后处理文本