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的基本形式,我们要分析的不仅仅是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处理日志
我们需要的日志的格式是:日期 时间 级别,比如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 模块
import fileinput
import sysimport 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模块之递归处理文件和文件夹
这里有两个需求:
-
删除某个目录以及子目录下的所有.svn文件
-
删除某个文件夹下所有文件
在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代码:
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
出处: 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
出处: http://bluescorpio.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。