基于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 相关文章推荐
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 Python
Python3.2中Print函数用法实例详解
May 19 Python
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
Python实现读取json文件到excel表
Nov 18 Python
Python生成短uuid的方法实例详解
May 29 Python
实践Vim配置python开发环境
Jul 02 Python
Python装饰器基础概念与用法详解
Dec 22 Python
Python3.5装饰器原理及应用实例详解
Apr 30 Python
python 实现简单的FTP程序
Dec 27 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
python 下划线的不同用法
Oct 24 Python
利用python为PostgreSQL的表自动添加分区
Jan 18 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为SHOPEX增加日志功能代码
2010/07/02 PHP
php中定义网站根目录的常用方法
2010/08/08 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
js电话号码验证方法
2015/09/28 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
js的对象与函数详解
2019/01/21 Javascript
layui使用label标签的方法
2019/09/14 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
HTML的form表单和django的form表单
2019/07/25 Python
python实现桌面气泡提示功能
2019/07/29 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
实习自荐信
2013/10/13 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python