Python处理日志之取得文件列表(更新)

Python处理日志之取得文件列表(更新)

这篇文章里面讲述了如何通过glob模块取得列表,但由于glob能使用的正则表达式有限,所以只能说是完成了部分任务,今天看《Python技术参考大全》受到启发,我们可以使用正则表达式去检查每个文件名,这样就可以找到所需的文件列表。

fileList = []

pattern = r"seeUthere_errors.log(/./d{4}-/d{2}-/d{2}-/d{2})"


for eachfile in glob.glob(r"D:/Log/./*"):
if re.search(pattern, eachfile):
fileList.append(eachfile)


延伸:

如果要取得当天生成的复合正则表达式的log 列表呢?

按照日志生成的格式,我们可以利用time模块的strftime方法,得到当前天:2009-11-12

import time

current = time.strftime("%Y-%m-%d", time.gmtime())

然后修改pattern:

pattern = r"seeUthere_errors.log(/.)" + current + "(-/d{2})"

再采取上面的方法就可以了。

 

Python:正则表达式匹配任意字符(包括换行符)的写法

想使用正则表达式来获取一段文本中的任意字符,写出如下匹配规则:
(.*)
结果运行之后才发现,无法获得换行之后的文本。于是查了一下手册,才发现正则表达式中,“.”(点符号)匹配的是除了换行符“/n”以外的所有字符。

以下为正确的正则表达式匹配规则:
([/s/S]*)
同时,也可以用 “([/d/D]*)”、“([/w/W]*)” 来表示。 Web技术之家_www.waweb.cn

在文本文件里, 这个表达式可以匹配所有的英文
/[ -~]/

Python处理日志之取得文件列表

为防止log日志过大,每隔一小时就会把重新写log文件,而之间的文件则重命名为server_errors.log.yyyy-dd-mm-nn,其中nn为序号,从00到23.

鉴于我们log的基本形式,我们要分析的不仅仅是errors.log,还需要分析其他当天产生的文件,这就需要一个方法去取得这些文件的列表。

开始的时候,准备通过glob模块来取得文件列表,glob根据给定模式生成满足该模式的文件名列表, 和 Unix shell 相同.
for eachfile in glob.glob(r"D:/Log/*.log"):
    print eachfile
注意glob返回完整路径名, 这点和os.listdir函数不同。

但是glob的不是正则,是UnixShell的规则。除了*,?,[]之外,其他的正则表达式不能用。

于是只能另起炉灶,这次使用的是os.listdir,
因为这些文件都是以相同的名字开头,可以使用startswith方法进行过滤,然后通过文件的创建时间来取得今天产生的log文件列表 

Python处理日志

1. 从server上读取log文件(//url/server_errors.log)
我们需要的日志的格式是:日期 时间 级别,比如2009-10-15 23:33:28,140 ERROR
这里有两个方法:
第一,利用readlines()方法循环一个文本文件
第二,利用fileinput 模块循环一个文本文件
2. 从log最后开始匹配正则表达式,得到合适的log信息
我们目前只需要日志级别为ERROR的信息,在两个日期正则表达式之间的日志都要读取出来。
3. 日志搜集中心
把含有Error信息的log内容通过日志发给相关人员。
log的基本形式,为防止log日志过大,每隔一小时就会把重新写log文件,而之间的文件则重命名为server_errors.log.yyyy-dd-mm-nn,其中nn为序号,从00到23
主要架构:
1. 一些基本设置,比如server地址,log级别
2. LogParser类
2.1 __init__()方法,初始化
2.2 getFileList,主要读取今天所有log文件的list
2.3 parseLog,主要分析,存储有用的log信息
2.4 sendLog,把log发到相关人员

Python之fileinput 模块

fileinput模块允许你循环一个或多个文本文件的内容, 我们可以使用这个功能去分析处理Log

 

import fileinput

import sys
import re

pattern = "/d{4}-/d{2}-/d{2} /d{2}:/d{2}:/d{2}"
filePath = r"C:/seeUthere_errors.log"

for eachline in fileinput.input(filePath):
    m = re.search(pattern, eachline)
    if m:
        sys.stdout.write("==>> ")
        sys.stdout.write(eachline)

还可以使用 fileinput模块获得当前行的元信息 (meta information). 其中包括 isfirstline, filename, lineno

Python模块之递归处理文件和文件夹

这里有两个需求:

  1. 删除某个目录以及子目录下的所有.svn文件

  2. 删除某个文件夹下所有文件

在Python中,文件操作主要来自os模块,主要方法如下:

os.listdir(dirname):列出dirname下的目录和文件
os.getcwd():获得当前工作目录
os.curdir:返回当前目录('.')
os.chdir(dirname):改变工作目录到dirname

os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false
os.path.isfile(name):判断name是不是一个文件,不存在name也返回false
os.path.exists(name):判断是否存在文件或目录name
os.path.getsize(name):获得文件大小,如果name是目录返回0L

os.path.abspath(name):获得绝对路径
os.path.normpath(path):规范path字符串形式
os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
os.path.splitext():分离文件名与扩展名
os.path.join(path,name):连接目录与文件名或目录
os.path.basename(path):返回文件名
os.path.dirname(path):返回文件路径


os.remove(dir) #dir为要删除的文件夹或者文件路径
os.rmdir(path) #path要删除的目录的路径。需要说明的是,使用os.rmdir删除的目录必须为空目录,否则函数出错。

删除目录下的svn代码:


#!/usr/bin/env python
#
coding=utf-8
import sys, os, stat

def walk(path):
    
for item in os.listdir(path):
        subpath 
= os.path.join(path, item)
        mode 
= os.stat(subpath)[stat.ST_MODE]
        
if stat.S_ISDIR(mode):
            
if item == ".svn":
                
print "Cleaning %s " %subpath
                
print "%d deleted" % purge(subpath)
            
else:
                walk(subpath)

def purge(path):
    count 
= 0
    
for item in os.listdir(path):
        subpath 
= os.path.join(path, item)
        mode 
= os.stat(subpath)[stat.ST_MODE]
        
if stat.S_ISDIR(mode):
            count 
+= purge(subpath)
        
else:
            os.chmod(subpath, stat.S_IREAD
|stat.S_IWRITE)
            os.unlink(subpath)
            count 
+= 1
    os.rmdir(path)
    count 
+= 1
    
return count
if len(sys.argv) != 2:
    
print "Usage: python cleansvn.py path"
    sys.exit(
1)
walk(sys.argv[
1])
删除某目录下所有文件和文件夹:

#!/usr/bin/env python
#
coding=utf-8
import os

def delete_all_file(path):
    
"delete all folers and files"
    
if os.path.isfile(path):
        
try:
            os.remove(path)
        
except:
            
pass
    
elif os.path.isdir(path):
        
for item in os.listdir(path):
            itemsrc 
= os.path.join(path, item)
            delete_all_file(itemsrc)
        
try:
            os.rmdir(path)
        
except:
            
pass

if __name__ == "__main__":
    dirname 
= r'F:/trunk'
    
print delete_all_file(dirname)
作者: Shane
出处: http://bluescorpio.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Python模块之 __future__

今天在学习Python Cookbook的时候,发现一句语法from __future__ import division,很奇怪__future__这个名字,网上搜了一下,原来是很有用的一个模块。

详细说明见这里。按照官方的解释,至少确保在2.1之前版本的Python可以正常运行一些新的语言特性,需要使用语句 'from __future__ import *'。举例来说:

# Enable nested scopes in Python 2.1
from __future__ import nested_scopes

如果使用这个语句,则该语句必须是模块或程序的第一个语句。此外,'__ future__' 模块中存在的特性最终将成为Python语言标准的一部分。到那时,将不再需要使用 '__future__' 模块。

更多示例:

1. Python 2.6中也有一个 __future__ import 使得所有的字符串文本成为Unicode字符串。这就意味着/u转义序列可以用于包含Unicode字符。

from __future__ import unicode_literals

s = ('/u751f/u3080/u304e/u3000/u751f/u3054'
'/u3081/u3000/u751f/u305f/u307e/u3054')
print len(s) # 12 Unicode characters

2. Python 2.6可以通过 import __future__ 来将print从语言语法中移除,让你可以使用函数的形式。例如:

from __future__ import print_function
print('# of entries', len(dictionary), file=sys.stderr)

3. 整数除法

python 2.5中:23/6 # 得3
from __future__ import division 之后:
23/6 # 得 3.8333333333333335

作者: Shane
出处: http://bluescorpio.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值