Python fileinput模块使用实例


Posted in Python onJune 03, 2015

fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。
该模块的input()函数有点类似文件readlines()方法,区别在于:
前者是一个迭代对象,即每次只生成一行,需要用for循环迭代。
后者是一次性读取所有行。在碰到大文件的读取时,前者无疑效率更高效。
用fileinput对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。

【典型用法】

import fileinput

for 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.py  

import 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.py  

import 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.txt  

Python  

Java  

C/C++  

Shell  

  

#FileName: test.py  

import fileinput  

  

for line in fileinput.input('data.txt',backup='.bak',inplace=1):  

    print line.rstrip().replace('Python','Perl')  #或者print line.replace('Python','Perl'),  

      

#最后结果:  

#data.txt  

Python  

Java  

C/C++  

Shell  

#并生成:  

#data.txt.bak文件 

#其效果等同于下面的方式  

import fileinput  

for line in fileinput.input():  

    print 'Tag:',line,  

  

  

#---测试结果:     

d:\>python Learn.py < data.txt > data_out.txt 

例子04: 利用fileinput将CRLF文件转为LF

import fileinput  

import sys  

  

for line in fileinput.input(inplace=True):  

    #将Windows/DOS格式下的文本文件转为Linux的文件  

    if line[-2:] == "\r\n":    

        line = line + "\n"  

    sys.stdout.write(line) 

例子05: 利用fileinput对文件简单处理

#FileName: test.py  

import sys  

import fileinput  

  

for line in fileinput.input(r'C:\Python27\info.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 fileinput  

import 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: AAAAA  

2: BBBBB  

3: CCCCC  

4: DDDDD  

5: FFFFF  

-------------------- Reading test1.txt... --------------------  

6: FIRST LINE  

7: SECOND LINE  

-------------------- Reading test2.txt... --------------------  

8: THIRD LINE  

9: 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做日志分析: 提取所有含日期的行

#--样本文件--  

aaa  

1970-01-01 13:45:30  Error: **** Due to System Disk spacke not enough...  

bbb  

1970-01-02 10:20:30  Error: **** Due to System Out of Memory...  

ccc  

  

#---测试脚本---  

import re  

import fileinput  

import 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-99999999  

05718888888  

021-88888888  

  

#---测试脚本: test.py---  

import re  

import 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 sys  

import re  

import fileinput  

  

pattern= re.compile(sys.argv[1])  

for line in fileinput.input(sys.argv[2]):  

    if pattern.match(line):  

        print fileinput.filename(), fileinput.filelineno(), line  

$ ./test.py import.*re *.py  

#查找所有py文件中,含import re字样的  

addressBook.py  2   import re  

addressBook1.py 10  import re  

addressBook2.py 18  import re  

test.py         238 import re 

例子10: 利用fileinput做正则替换

#---测试样本: input.txt  

* [Learning Python](#author:Mark Lutz)  

      

#---测试脚本: test.py  

import fileinput  

import re  

   

for line in fileinput.input():  

    line = re.sub(r'\* 

(.∗)

#(.*)', r'<h2 id="\2">\1</h2>', line.rstrip())  

    print(line)  

  

#---输出结果:  

c:\Python27>python test.py input.txt  

<h2 id="author:Mark Lutz">Learning Python</h2> 

例子11: 利用fileinput做正则替换,不同字模块之间的替换

#---测试样本:test.txt  

[@!$First]&[*%-Second]&[Third]  

  

#---测试脚本:test.py  

import re  

import fileinput  

  

regex = re.compile(r'^([^&]*)(&)([^&]*)(&)([^&]*)')  

#整行以&分割,要实现[@!$First]与[*%-Second]互换  

for line in fileinput.input('test.txt',inplace=1,backup='.bak'):  

    print regex.sub(r'\3\2\1\4\5',line),  

  

#---输出结果:  

[*%-Second]&[@!$First]&[Third] 

例子12: 利用fileinput根据argv命令行输入做替换

#---样本数据: host.txt  

# localhost is used to configure the loopback interface  

# when the system is booting.  Do not change this entry.  

127.0.0.1      localhost  

192.168.100.2  www.test2.com  

192.168.100.3  www.test3.com  

192.168.100.4  www.test4.com  

  

#---测试脚本: test.py  

import sys  

import fileinput  

  

source = sys.argv[1]  

target = sys.argv[2]  

files  = sys.argv[3:]  

  

for line in fileinput.input(files,backup='.bak',openhook=fileinput.hook_encoded("gb2312")):  

    #对打开的文件执行中文字符集编码  

    line = line.rstrip().replace(source,target)  

    print line  

      

#---输出结果:      

c:\>python test.py 192.168.100 127.0.0 host.txt  

#将host文件中,所有192.168.100转换为:127.0.0  

127.0.0.1  localhost  

127.0.0.2  www.test2.com  

127.0.0.3  www.test3.com  

127.0.0.4  www.test4.com 
Python 相关文章推荐
Python用Pillow(PIL)进行简单的图像操作方法
Jul 07 Python
Anaconda入门使用总结
Apr 05 Python
python sys.argv[]用法实例详解
May 25 Python
解决Python2.7中IDLE启动没有反应的问题
Nov 30 Python
Python输出\u编码将其转换成中文的实例
Dec 15 Python
浅谈tensorflow 中tf.concat()的使用
Feb 07 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
Python通过len函数返回对象长度
Oct 22 Python
Python用Jira库来操作Jira
Dec 28 Python
用Python实现职工信息管理系统
Dec 30 Python
理解深度学习之深度学习简介
Apr 14 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 Python
以windows service方式运行Python程序的方法
Jun 03 #Python
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 #Python
python中list常用操作实例详解
Jun 03 #Python
python中argparse模块用法实例详解
Jun 03 #Python
Python中的推导式使用详解
Jun 03 #Python
对于Python装饰器使用的一些建议
Jun 03 #Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 #Python
You might like
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
List Installed Hot Fixes
2007/06/12 Javascript
通用JS事件写法实现代码
2009/01/07 Javascript
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
javascript与CSS复习(二)
2010/06/29 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
机械设计职业生涯规划书
2013/12/27 职场文书
土建资料员岗位职责
2014/01/04 职场文书
yy婚礼主持词
2014/03/14 职场文书
成立公司计划书
2014/05/07 职场文书
应届生找工作求职信
2014/06/24 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
销售经理助理岗位职责
2015/04/13 职场文书