基于Python实现大文件分割和命名脚本过程解析


Posted in Python onSeptember 29, 2019

日志文件分割、命名

工作中经常会收到测试同学、客户同学提供的日志文件,其中不乏几百M一G的也都有,毕竟压测一晚上产生的日志量还是很可观的,xDxD,因此不可避免的需要对日志进行分割,通常定位问题需要针对时间点,因此最好对分割后的日志文件使用文件中日志的开始、结束时间点来命名,这样使用起来最为直观,下面给大家分享两个脚本,分别作分割、命名,希望能够给大家提供一点点帮助;

大文件分割

用法:

  • python split_big_file.py
  • 输入文件全路径名
  • 输入期望的分割后每个小文件的行数
  • Just wait.
# -*- coding:utf-8 -*-

 import os,re,shutil
 import platform

 sys_name = platform.system().lower()
 SPLIT_CHAR = '\\' if sys_name.find('windows') != -1 else '/'

 print('input big files`s path:')
 _path = raw_input()
 names = []
 pathes = []
 if os.path.isfile(_path):
   print('is file')
   names.append(_path)
 else:
   print('is nothing')
 '''
 elif os.path.isdir(_path):
   print('This is dir')
   pathes = os.listdir(_path)
   print('pathes='+str(pathes))
   for i in range(len(pathes)):
     fullpath = _path+SPLIT_CHAR+pathes[i]
     print('fullpath='+fullpath)
     if os.path.isfile(fullpath):
       names.append(fullpath)
       files.append(open(fullpath).read().split('\n'))
 '''

 print(len(names))

 line_num = int(raw_input('every file`line num = '))
 print('line number='+str(line_num))

 for i in range(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('.','_')
   print ori_name
   print dir_name
   os.system('mkdir '+dir_name)
   count = 1
   print '已处理:'+str(count)+'行'
   part_file = open(dir_name+SPLIT_CHAR+str(0)+'.part.txt','w')
   with open(_name, 'rb') as f:
     for line in f:
     if count%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
     if count%100000 == 0:
       print '已处理:'+str(count)+'行'
   print '已处理:'+str(count)+'行'
   os.system('python ./get_name_logfile.py '+dir_name)

文件按照开始、结束行时间戳重命名

用法:

python get_name_logfile.py log.txt

python get_name_logfile.py logs

参数选择文件或者文件夹均可,如果是文件夹,则会针对文件夹中的每个文件做处理(不会递归到文件夹下文件夹中的文件哦);

# -*- coding:utf-8 -*-


  import os,re,shutil
  import sys
  import platform

  sys_name = platform.system().lower()
  SPLIT_CHAR = '\\' if sys_name.find('windows') != -1 else '/'

  _path = sys.argv[1]
  names = []
  files = []
  pathes = []
  if os.path.isfile(_path):
    print('is file')
    names[0] = _path
  elif os.path.isdir(_path):
    print('This is dir')
    pathes = os.listdir(_path)
    print('pathes='+str(pathes))
    for i in range(len(pathes)):
      fullpath = _path+SPLIT_CHAR+pathes[i]
      print('fullpath='+fullpath)
      if os.path.isfile(fullpath):
        names.append(fullpath)
  else:
    print('is nothing')
    
  print(len(names))

  #  日期格式 : 05-26 18:20:42.093  r'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}'
  #  
  #  05-26 18: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}'

  for i in range(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')
    if len(_file)/2 < 10:
      head_len = len(_file)/2
    for j in range(head_len):
      res = re.search(date_reg, _file[j])
      if res!=None and res.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)'
    for j in range(len(_file)-1,tail_len-1,-1):
      res = re.search(time_reg, _file[j])
      if res!=None and res.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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python脚本实现网卡流量监控
Feb 14 Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 Python
Python操作MySQL数据库的方法
Jun 20 Python
python读取txt文件并取其某一列数据的示例
Feb 19 Python
python3.7 使用pymssql往sqlserver插入数据的方法
Jul 08 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
pytorch SENet实现案例
Jun 24 Python
Python图像读写方法对比
Nov 16 Python
Python time库的时间时钟处理
May 02 Python
Python基于百度API识别并提取图片中文字
Jun 27 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 #Python
python使用opencv实现马赛克效果示例
Sep 28 #Python
python打包成so文件过程解析
Sep 28 #Python
python基于FTP实现文件传输相关功能代码实例
Sep 28 #Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 #Python
在vscode中配置python环境过程解析
Sep 28 #Python
python爬虫 线程池创建并获取文件代码实例
Sep 28 #Python
You might like
PHP往XML中添加节点的方法
2015/03/12 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
JavaScript的Function详细
2006/11/14 Javascript
javascript removeChild 使用注意事项
2009/04/11 Javascript
jquery中动态效果小结
2010/12/16 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
2016/01/27 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
详解用vue.js和laravel实现微信支付
2017/06/23 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
python脚本内运行linux命令的方法
2015/07/02 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
python删除不需要的python文件方法
2018/04/24 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
pytorch 改变tensor尺寸的实现
2020/01/03 Python
Python3 assert断言实现原理解析
2020/03/02 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
Shell脚本如何向终端输出信息
2014/04/25 面试题
大学生职业生涯规划书模版
2013/12/30 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
给学校的建议书范文
2014/05/15 职场文书
2015年党建工作总结
2015/03/30 职场文书
公司开除员工通知
2015/04/22 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android