基于Python实现大文件分割和命名脚本过程解析
日志文件分割、命名
工作中经常会收到测试同学、客户同学提供的日志文件,其中不乏几百M一G的也都有,毕竟压测一晚上产生的日志量还是很可观的,xDxD,因此不可避免的需要对日志进行分割,通常定位问题需要针对时间点,因此最好对分割后的日志文件使用文件中日志的开始、结束时间点来命名,这样使用起来最为直观,下面给大家分享两个脚本,分别作分割、命名,希望能够给大家提供一点点帮助;
大文件分割
用法:
- pythonsplit_big_file.py
- 输入文件全路径名
- 输入期望的分割后每个小文件的行数
- Justwait.
#-*-coding:utf-8-*-
importos,re,shutil
importplatform
sys_name=platform.system().lower()
SPLIT_CHAR='\\'ifsys_name.find('windows')!=-1else'/'
print('inputbigfiles`spath:')
_path=raw_input()
names=[]
pathes=[]
ifos.path.isfile(_path):
print('isfile')
names.append(_path)
else:
print('isnothing')
'''
elifos.path.isdir(_path):
print('Thisisdir')
pathes=os.listdir(_path)
print('pathes='+str(pathes))
foriinrange(len(pathes)):
fullpath=_path+SPLIT_CHAR+pathes[i]
print('fullpath='+fullpath)
ifos.path.isfile(fullpath):
names.append(fullpath)
files.append(open(fullpath).read().split('\n'))
'''
print(len(names))
line_num=int(raw_input('everyfile`linenum='))
print('linenumber='+str(line_num))
foriinrange(len(names)):
_name=names[i]
ori_name=_name.split(SPLIT_CHAR)[len(_name.split(SPLIT_CHAR))-1]
dir_name=_name.replace(ori_name,'DIR_'+ori_name)
dir_name=dir_name.replace('.','_')
printori_name
printdir_name
os.system('mkdir'+dir_name)
count=1
print'已处理:'+str(count)+'行'
part_file=open(dir_name+SPLIT_CHAR+str(0)+'.part.txt','w')
withopen(_name,'rb')asf:
forlineinf:
ifcount%line_num==0:
part_file.close()
part_file=open(dir_name+SPLIT_CHAR+str(int(count/line_num))+'.part.txt','w')
part_file.write(line+'\n')
count+=1
ifcount%100000==0:
print'已处理:'+str(count)+'行'
print'已处理:'+str(count)+'行'
os.system('python./get_name_logfile.py'+dir_name)
文件按照开始、结束行时间戳重命名
用法:
pythonget_name_logfile.pylog.txt
pythonget_name_logfile.pylogs
参数选择文件或者文件夹均可,如果是文件夹,则会针对文件夹中的每个文件做处理(不会递归到文件夹下文件夹中的文件哦);
#-*-coding:utf-8-*-
importos,re,shutil
importsys
importplatform
sys_name=platform.system().lower()
SPLIT_CHAR='\\'ifsys_name.find('windows')!=-1else'/'
_path=sys.argv[1]
names=[]
files=[]
pathes=[]
ifos.path.isfile(_path):
print('isfile')
names[0]=_path
elifos.path.isdir(_path):
print('Thisisdir')
pathes=os.listdir(_path)
print('pathes='+str(pathes))
foriinrange(len(pathes)):
fullpath=_path+SPLIT_CHAR+pathes[i]
print('fullpath='+fullpath)
ifos.path.isfile(fullpath):
names.append(fullpath)
else:
print('isnothing')
print(len(names))
#日期格式:05-2618:20:42.093r'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}'
#
#05-2618:20:43.093:r'\d{2}-\d{2}{1,}\d{2}:\d{2}:\d{2}.\d{1,10}'
date_reg=r'\d{2}-\d{2}{1,}\d{2}:\d{2}:\d{2}.\d{1,10}'
time_reg=r'\d{2}:\d{2}:\d{2}.\d{1,10}'
foriinrange(len(names)):
_name=names[i]
print('name='+_name)
#head尝试在10行内查找日期
head_len=10
start_time='(start_time-'
_file_=open(_name,'rb')
reads=_file_.read()
_file=reads.split('\n')
iflen(_file)/2<10:
head_len=len(_file)/2
forjinrange(head_len):
res=re.search(date_reg,_file[j])
ifres!=Noneandres.group(0)!=None:
start_time=res.group(0)
print('start_time='+start_time)
break
#tail
tail_len=len(_file)-head_len
end_time='-end_time)'
forjinrange(len(_file)-1,tail_len-1,-1):
res=re.search(time_reg,_file[j])
ifres!=Noneandres.group(0)!=None:
end_time=res.group(0)
print('end_time='+end_time)
break
_file_.close()
ori_name=_name.split(SPLIT_CHAR)[len(_name.split(SPLIT_CHAR))-1]
print('ori_name='+ori_name)
new_name=start_time.replace(':','-')+'__'+end_time.replace(':','-')+os.path.splitext(ori_name)[1]
print('new_name='+new_name)
print("copy%s%s"%(_name,_name.replace(ori_name,new_name)))
#os.system("copy%s%s"%(_name,_name.replace(ori_name,new_name)))
shutil.copy(_name,_name.replace(ori_name,new_name))
os.system("rm-rf"+_name)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。