背景
最近课长时不时让我统计CDN服务器上某个zip的下载次数。
确认了一下访问log。30天的log大概700多个文件,90万行,140M左右。从里面过滤出必须的几百条。
本来最简单的办法是使用Talend,但是打开去年安装的Talend发现软件已经更新N版,且我本地的java版本变换过几次,导致不兼容。重新下载和安装费时费力。于是放弃了。
第一次统计采用最原始的execl和txt文本处理,倒也是能对付的了。
只是90万行,execl处理起来基本每一步骤都是死机状态。
最后决定自己用新学的python写几行代码实现。
程序构造
- 读取log文件
- 判断有没有关键字
- 有的话输入到output.txt中
提前准备
首先把700多个log文件合并到一起。
合并工具
在txt文本中写一行命令
type *.txt > input.txt
保存为hebing.bat
双击bat
把hebing.bat拷贝到存放700多个log的文件夹下,双击执行。这样就生成了input.txt
是不是很简单?!
log过滤程序初版
把input.txt剪切到mapDownload.py所在的文件夹。
mapDownload.py内容如下
#-*- coding:UTF-8 -*-
#读取一个文件的每一行,每一行为一个字符串
#判断字符串中是否包含【XXXXXX.zip】关键字
#包含的话,就输出这一行到别的文件中
#mapDownload.py 和 input.txt output.txt 放在一个文件夹下执行py文件
import sys
import math
#打开文件
try:
file_object=open('input.txt',"r+")
except IOError:
print ("No Found File!")
else:
file_result=open('output.txt',"w+")
#判断是否包含XXXXXX.zip
def IncludeOverall(str):
if str.find('XXXXXX.zip')<0:
return False
else:
return True
#读取文件
print("。。。")
for line in file_object:
line = line.strip()
if IncludeOverall(line):
file_result.write(line+"\n")
else:
continue
file_object.close()
file_result.close()
print("完成")
执行
双击mapDownload.py之后查看output.txt
※python版本3.6,需要自行设定环境变量
执行了效果
90万行抽取出570行,用时大概2,3秒
进化版
初版中input和output文件是写死在代码中,现在做一版有UI的,可以选择任意路径文件和输入过滤任意关键字。
程序代码
main.py
import os
from filter import mains
from tkinter import *
from tkinter.filedialog import askopenfilename
def exists_mkdir():
if os.path.exists('D:\output.txt'):
pass
else:
os.mknod('D:\output.txt')
def logdo():
c["text"] = "开始。。。"
try:
s1 = pathObj.get()
s2 = keyword.get()
if s1.strip()=='' or s2.strip()=='':
c["text"] = "请选择文件并输入关键字!"
elif not os.path.exists(s1):
c["text"] = "请正确选择文件!"
else:
if mains(s1,s2) :
c["text"] = "运行成功"
else:
c["text"] = "好像哪里出错了"
except Exception:
c["text"] = "好像哪里出错了"
def selectPath():
path_ = askopenfilename()
logpath.set(path_)
#创建程序运行需要的工作目录
exists_mkdir()
tk = Tk()
# 设置字体
tk.option_add("*Font", "宋体")
# 设置窗口大小和位置
tk.geometry('430x350+80+60')
# 不允许改变窗口大小
tk.resizable(False, False)
## 用来显示Label组件
tk.title('log过滤')
w1 = Label(tk,text='欢迎使用')
w2 = Label(tk,text='步骤1:选择需要过滤的文件')
w3 = Label(tk,text='步骤2:输入需要过滤的关键字')
w4 = Label(tk,text='步骤3:点击执行按钮直到结束')
w1.grid(row=1,column=0,sticky=W)
w2.grid(row=2,column=0,sticky=W)
w3.grid(row=3,column=0,sticky=W)
w4.grid(row=4,column=0,sticky=W)
logpath = StringVar()
Label(tk,text = "*目标路径:").grid(row = 9, column = 0,sticky=W)
pathObj = Entry(tk, textvariable = logpath)
pathObj.grid(row = 10, column = 0,columnspan=2,sticky=W)
Button(tk, text = "路径选择", command = selectPath).grid(row = 10, column = 2,sticky=E)
## 用来显示输入框
lWord = Label(tk,text="*输入关键字:")
lWord.grid(row=11,column=0,sticky=W)
keyword = Entry(tk)
keyword.grid(row=12,column=0,sticky=W)
## 用来显示Button
b = Button(tk,text='执行抽取',command=logdo)
b.grid(row=18,column=0,sticky=E,columnspan=3,rows=3)
c = Label(tk,text="",background="yellow")
c.grid(row = 22,column=0,sticky=W)
# 启动消息主循环
tk.mainloop()
filter.py
#-*- coding:UTF-8 -*-
#读取一个文件的每一行,每一行为一个字符串
#判断字符串中是否包含关键字
#包含的话,就输出这一行到别的文件中
import sys
import math
def mains(path,keyword):
try:
#打开文件
file_object=open(path,"r+")
except IOError:
print ("No Found File!")
return False
else:
file_result=open('D:\output.txt',"w+")
#判断是否包含关键字
def IncludeOverall(str):
if str.find(keyword)<0:
return False
else:
return True
#读取文件
print("开始抽取")
for line in file_object:
line = line.strip()
#print(line)
if IncludeOverall(line):
file_result.write(line+"\n")
else:
continue
file_object.close()
file_result.close()
print("抽取结束")
return True
执行
双击main.py
※python版本3.6,需要自行设定环境变量
执行效果
然后在D盘自动生成结果文件output.txt。
exe
尝试打包成exe,一直不成功。先留坑吧,作为以后课题。
总结
python简单上手快,资源比较多。有一定编程基础可以很快上手,借助google先生可以很快做出一些小工具。