基于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中contextlib上下文管理模块的用法
Jun 28 Python
详解使用 pyenv 管理多个版本 python 环境
Oct 19 Python
机器学习10大经典算法详解
Dec 07 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
Python实现处理逆波兰表达式示例
Jul 30 Python
详解Python 切片语法
Jun 10 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
简单了解django索引的相关知识
Jul 17 Python
python3.x提取中文的正则表达式示例代码
Jul 23 Python
Django 响应数据response的返回源码详解
Aug 06 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
Sep 16 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之Memcache学习笔记
2013/06/17 PHP
理解PHP中的stdClass类
2014/04/18 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
PHP实现二维数组根据key进行排序的方法
2016/12/30 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
数学教学随笔感言
2014/02/17 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
小学生作文评语
2014/04/18 职场文书
关爱残疾人标语
2014/06/25 职场文书
审美与表现自我评价
2015/03/09 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
护士旷工检讨书
2015/08/15 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
创业计划书之农家乐
2019/10/09 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技
SQL Server中搜索特定的对象
2022/05/25 SQL Server