基于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 相关文章推荐
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
window下eclipse安装python插件教程
Apr 24 Python
pycharm远程调试openstack代码
Nov 21 Python
python中reader的next用法
Jul 24 Python
python opencv实现证件照换底功能
Aug 19 Python
pygame实现打字游戏
Feb 19 Python
python shell命令行中import多层目录下的模块操作
Mar 09 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
python 8种必备的gui库
Aug 27 Python
python从Oracle读取数据生成图表
Oct 14 Python
用sleep间隔进行python反爬虫的实例讲解
Nov 30 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 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
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
javascript jQuery插件练习
2008/12/24 Javascript
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
使用python接入微信聊天机器人
2020/03/31 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
幼教个人求职信范文
2013/12/02 职场文书
大型会议策划方案
2014/05/17 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
公证委托书标准格式
2014/09/11 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
工程催款通知书
2015/04/17 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
2019学生会干事辞职信
2019/06/27 职场文书
Python之基础函数案例详解
2021/08/30 Python
Redis入门基础常用操作命令整理
2022/06/01 Redis