基于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 08 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
Python快速从注释生成文档的方法
Dec 26 Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
python实现画五角星和螺旋线的示例
Jan 20 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
python自动化测试无法启动谷歌浏览器问题
Oct 10 Python
通过实例学习Python Excel操作
Jan 06 Python
使用Django实现商城验证码模块的方法
Jun 01 Python
使用pipenv管理python虚拟环境的全过程
Sep 25 Python
Python循环之while无限迭代
Apr 30 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 获取目录下的图片并随机显示的代码
2009/12/28 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
ThinkPHP分页类使用详解
2014/03/05 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
js用图作提交按钮或超连接
2008/03/26 Javascript
js 表格隔行颜色
2009/12/02 Javascript
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
javascript匀速动画和缓冲动画详解
2016/10/20 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
js实现批量删除功能
2020/08/27 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
python安装本地whl的实例步骤
2019/10/12 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
Python列表推导式实现代码实例
2020/09/09 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
ASP.NET中的身份验证有那些
2012/07/13 面试题
无房证明范本
2014/09/17 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
公司租房协议书范本
2014/10/08 职场文书
新员工试用期自我评价
2015/03/10 职场文书
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js