? ?
? ?Python中fileinput模块使用 ? ?
2016-07-03 11:50?狂师? 阅读(15516)? 评论(1)?编辑?收藏 ? ?
fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。该模块的input()函数有点类似文件
readlines()方法,区别在于前者是一个迭代对象,需要用for循环迭代,后者是一次性读取所有行。
用fileinput对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。
【典型用法】
import?fileinputfor?line?in?fileinput.input(): ????process(line)
【基本格式】
fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])
?
【默认格式】
fileinput.input (files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)
files:????????????????? #文件的路径列表,默认是stdin方式,多文件[ '1.txt' , '2.txt' ,...] inplace:??????????????? #是否将标准输出的结果写回文件,默认不取代 backup:???????????????? #备份文件的扩展名,只指定扩展名,如.bak。如果该文件的备份文件已存在,则会自动覆盖。 bufsize:??????????????? #缓冲区大小,默认为 0 ,如果文件很大,可以修改此参数,一般默认即可 mode:?????????????????? #读写模式,默认为只读 openhook:?????????????? #该钩子用于控制打开的所有文件,比如说编码方式等; ?【常用函数】?fileinput.input()???????#返回能够用于for循环遍历的对象fileinput.filename()????#返回当前文件的名称fileinput.lineno()??????#返回当前已经读取的行的数量(或者序号)fileinput.filelineno()??#返回当前读取的行的行号fileinput.isfirstline()?#检查当前行是否是文件的第一行fileinput.isstdin()?????#判断最后一行是否从stdin中读取fileinput.close()???????#关闭队列
【常见例子】
例子01: 利用fileinput读取一个文件所有行
>>>?import?fileinput>>>?for?line?in?fileinput.input('data.txt'):????print?line,#输出结果Python Java? C/C++Shell
命令行方式:
#test.pyimport?fileinput? for?line?in?fileinput.input():????print?fileinput.filename(),'|','Line?Number:',fileinput.lineno(),'|:?',line ? c:>python?test.py?data.txt data.txt?|?Line?Number:?1?|:??Python data.txt?|?Line?Number:?2?|:??Java data.txt?|?Line?Number:?3?|:??C/C++data.txt?|?Line?Number:?4?|:??Shell
例子02: 利 用fileinput对多文件操作,并原地修改内容
#test.py#---样本文件---c:Python27>type?1.txt first second ? c:Python27>type?2.txt third fourth#---样本文件---import?fileinput? def?process(line):????return?line.rstrip()?+?'?line' ?for?line?in?fileinput.input(['1.txt','2.txt'],inplace=1):????print?process(line)? #---结果输出---c:Python27>type?1.txt first?line second?line ? c:Python27>type?2.txt third?line fourth?line
命令行方式:
#test.pyimport?fileinput? def?process(line):????return?line.rstrip()?+?'?line' ?for?line?in?fileinput.input(inplace?=?True):????print?process(line)? #执行命令c:Python27>python?test.py?1.txt?2.txt
例子03: 利用fileinput实现文件内容替换,并将原文件作备份
#样本文件:#data.txtPython Java C/C++Shell? #FileName:?test.pyimport?fileinput? for?line?in?fileinput.input('data.txt',backup='.bak',inplace=1):????print?line.rstrip().replace('Python','Perl')??#或者print?line.replace('Python','Perl'), ?????#最后结果:#data.txtPython Java C/C++Shell#并生成:#data.txt.bak文件
例子04: 利用fileinput将CRLF文件转为LF
import?fileinputimport?sys? for?line?in?fileinput.input(inplace=True):????#将Windows/DOS格式下的文本文件转为 Linux 的文件 ????if?line[-2:]?==?:?? ????????line?=?line?+? ? ????sys.stdout.write(line)
例子05: 利用fileinput对文件简单处理
#FileName:?test.pyimport?sysimport?fileinput? for?line?in?fileinput.input(r'C:Python27info.txt'): ????sys.stdout.write('=>?') ????sys.stdout.write(line)? #输出结果???>>>? =>?The?Zen?of?Python,?by?Tim?Peters=>? =>?Beautiful?is?better?than?ugly.=>?Explicit?is?better?than?implicit.=>?Simple?is?better?than?complex.=>?Complex?is?better?than?complicated.=>?Flat?is?better?than?nested.=>?Sparse?is?better?than?dense.=>?Readability?counts.=>?Special?cases?aren't?special?enough?to?break?the?rules.=>?Although?practicality?beats?purity.=>?Errors?should?never?pass?silently.=>?Unless?explicitly?silenced.=>?In?the?face?of?ambiguity,?refuse?the?temptation?to?guess.=>?There?should?be?one--?and?preferably?only?one?--obvious?way?to?do?it.=>?Although?that?way?may?not?be?obvious?at?first?unless?you're?Dutch.=>?Now?is?better?than?never.=>?Although?never?is?often?better?than?*right*?now.=>?If?the?implementation?is?hard?to?explain,?it's?a?bad?idea.=>?If?the?implementation?is?easy?to?explain,?it?may?be?a?good?idea.=>?Namespaces?are?one?honking?great?idea?--?let's?do?more?of?those!
例子06: 利用fileinput批处理文件
#---测试文件:?test.txt?test1.txt?test2.txt?test3.txt---#---脚本文件:?test.py---import?fileinputimport?glob? for?line?in?fileinput.input(glob.glob(test*.txt)):????if?fileinput.isfirstline():????????print?'-'*20,?'Reading?%s...'?%?fileinput.filename(),?'-'*20????print?str(fileinput.lineno())?+?':?'?+?line.upper(),????? ????? #---输出结果:>>>? --------------------?Reading?test.txt...?-------------------- 1:?AAAAA2:?BBBBB3:?CCCCC4:?DDDDD5:?FFFFF--------------------?Reading?test1.txt...?-------------------- 6:?FIRST?LINE7:?SECOND?LINE--------------------?Reading?test2.txt...?-------------------- 8:?THIRD?LINE9:?FOURTH?LINE--------------------?Reading?test3.txt...?-------------------- 10:?THIS?IS?LINE?1 11:?THIS?IS?LINE?2 12:?THIS?IS?LINE?3 13:?THIS?IS?LINE?4
例子07: 利用fileinput及re做日志分析: 提取所有含日期的行
#--样本文件--aaa1970-01-01?13:45:30??Error:?****?Due?to?System?Disk?spacke?not?enough... bbb1970-01-02?10:20:30??Error:?****?Due?to?System?Out?of?Memory... ccc? #---测试脚本---import?reimport?fileinputimport?sys ? pattern?=?'d{4}-d{2}-d{2}?d{2}:d{2}:d{2}' ?for?line?in?fileinput.input('error.log',backup='.bak',inplace=1):????if?re.search(pattern,line): ????????sys.stdout.write(=>?) ????????sys.stdout.write(line)? #---测试结果---=>?1970-01-01?13:45:30??Error:?****?Due?to?System?Disk?spacke?not?enough...=>?1970-01-02?10:20:30??Error:?****?Due?to?System?Out?of?Memory...
例子08:? 利用fileinput及re做分析: 提取符合条件的电话号码
#---样本文件:?phone.txt---010-110-12345 800-333-1234 010-9999999905718888888 021-88888888? #---测试脚本:?test.py---import?reimport?fileinput ? pattern?=?'[010|021]-d{8}'??#提取区号为010或021电话号码,格式:010-12345678 ?for?line?in?fileinput.input('phone.txt'):????if?re.search(pattern,line):????????print?'='?*?50????????print?'Filename:'+?fileinput.filename()+'?|?Line?Number:'+str(fileinput.lineno())+'?|?'+line,? #---输出结果:--->>>? ==================================================Filename:phone.txt?|?Line?Number:3?|?010-99999999 ==================================================Filename:phone.txt?|?Line?Number:5?|?021-88888888 >>>
例子09:利用fileinput实现类似于grep的功能
import?sysimport?reimport?fileinput pattern=?re测试数据pile(sys.argv[1])for?line?in?fileinput.input(sys.argv[2]):if?pattern.match(line):print?fileinput.filename(),?fileinput.filelineno(),?line $?./test.py?import.*?fileinput?*.py
例子10: 利用fileinput做正则替换
#---测试样本:?input.txt*?[Learning?Python](#author:Mark?Lutz) ?????#---测试脚本:?test.pyimport?fileinputimport?re?? for?line?in?fileinput.input(): ????line?=?re.sub(r'*?[(.*)](#(.*))',?r'
?
分类 ? ? ? ? ? ?Python ?查看更多关于Python中fileinput模块使用的详细内容...