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之坑爹的字符编码
Sep 28 Python
python中正则的使用指南
Dec 04 Python
python 调用c语言函数的方法
Sep 29 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
python去掉空白行的多种实现代码
Mar 19 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
python 处理微信对账单数据的实例代码
Jul 19 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
Feb 28 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
Python smtp邮件发送模块用法教程
Jun 15 Python
Python爬虫基础之爬虫的分类知识总结
May 13 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
linux中cd命令使用详解
2015/01/08 PHP
ucenter通信原理分析
2015/01/09 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
JavaScript事件列表解说
2006/12/22 Javascript
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
node.js 发布订阅模式的实例
2017/09/10 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
详解React 条件渲染
2020/07/08 Javascript
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
selenium 安装与chromedriver安装的方法步骤
2019/06/12 Python
Python中的延迟绑定原理详解
2019/10/11 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
大专生自荐信
2013/10/04 职场文书
法律专业实习鉴定
2013/12/22 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
人事任命书怎么写
2014/06/05 职场文书
优秀团员个人总结
2015/02/26 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
导游词之铁岭象牙山
2019/12/06 职场文书
全网非常详细的pytest配置文件
2022/07/15 Python