Python fileinput 模块

 这几天有这样一个需求,要将用户登陆系统的信息统计出来,做成一个报表。当用户登陆成功的时候,服务器会往日志文件里写一条像下面这种格式的记录:”日期时间@用户名@IP“,这样的日志文件第天生成一个。所以,我们只要编历这些日志文件,将所有的登陆信息提取出来,并重新组织数据格式就可以了。用python写一个分析工具非常简单,你会说,用glob获取所有的日志文件,然后对每个日志文件都open(logfile),再一行一行的读取;或者用os.walk,也很简单。其实,标准库提供了另一个辅助模块,我们可以非常方便的完成这个工作,那就是fileinput。下面我们就通过fileinput来编历所有的D盘下的文本文件,将每一行的长度打印出来:
 
import fileinput
from glob import glob

for line in fileinput.input(glob(r'd:/*.txt')):
    print fileinput.lineno(), u'文件:', fileinput.filename(), /
            u'行号:', fileinput.filelineno(), u'长度:', len(line.strip('/n'))
fileinput.close()

    代码非常简单明了。input()接受要编历的所有文件路径的列表,通过filename()返回当前正在读取的文件的文件名,filelineno()返回当前读取的行的行号,而lineno()返回当前已经读取的行的数量(或者序号)。其实,模块内部通过FileInput类来实现文件的编历读取,input()在内部创建了该类的一个对象,当处理完数据行之后,通过fileinput.close()来关闭这个内部对象。

 



快速循环处理标准输入和文本文件

for line in fileinput.input()

没带参数,将会循环处理sys.argv中的文件,如果sys.argv是空的,将处理标准输入

fileinput.filename()

返回正在阅读的文件名

fileinput.fileno()

返回正在阅读的文件号

fileinput.lineno()

返回正在阅读的行号

fileinput.isfirstline()

判端是否为第一行

fileinput.isstdin()

判端正在读的是否是标准输入

fileinput.nextfile()

读取下一个文件

fileinput.close()

关闭所有读入的文件


fileinput.FileInput(files=Noneinplace=Falsebackup=''bufsize=0mode='r'openhook=None)

参数

files :文件的路径列表

inplace:是将标准输出(print方法)的结果写回文件

backup : 备份文件的扩展名

bufsize :缓冲区大小

mode :读写模式

openhook : 打开文件时的钩子


fileinput.FileInput(openhook=fileinput.hook_compressed)


fileinput.hook_compressed

可方便读写.gz .bz2 文件


fileinput.hook_encoded(encoding)

处理文件编码

 

 

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

 

 

转自:http://www.cnblogs.com/bluescorpio/archive/2009/10/19/1586102.html

http://blog.csdn.net/jgood/article/details/5984668等

你可能感兴趣的:(python)