fileinput模块用法

Posted dingbj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fileinput模块用法相关的知识,希望对你有一定的参考价值。

 

fileinput模块提供访问一个或多个文本文件的功能,可以通过使用for循环来读取一个或多个文本文件的所有行,从而进行逐行处理。
它的工作方式和readlines很类似,不同点在于它不是将全部的行读到列表中而是创建了一个xreadlines对象。而这个对象是通过input方法创建的。

input方法创建fileinput模块所属FileInput类的一个实例(对象),该实例被用作该模块的函数的全局状态,也在迭代期间被使用,input函数的参数将被传递给FileInput类的构造器。

input方法的原型为: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:               #该钩子用于控制打开的所有文件,比如说编码方式等;

典型使用方法如下:

ipput方法不带任何参数情况下,将对命令行列出的所有文件(命令行参数列表:sys.argv[1:])的所有行进行迭代,如果命令行也没有参数,则默认为  sys.stdin,如果文件名为‘-‘,也使用标准输入sys.stdin.。指定一个可变的文件名列表作为input()方法的第一个参数,当然单个文件名也是允许的,也可以使用files=(‘file1‘,‘’file2‘’)格式传递文件名。

import fileinput
for line in fileinput.input():
    process(line)

 


关键在这句话:标准输出会被重定向到打开文件
fileinput会自动把标准输出内容回写到文件,所以一定要用print打印到标准输出,如果没有用print打印到标准输出,那么就会把空内容回写到文件,也就是清除了文件所有内容

下面是fileinput模块中的常用函数:
input()   #返回能够用于for循环遍历的对象,该对象可迭代
filename()   #返回当前正在读取的文件名,如果第一行被读取之前调用将返回None
fileno()   #返回当前文件的文件描述符(1个整数),没有文件被打开(第一行之前或文件之间的时刻)将返回-1
lineno()   #返回当前已经累加读取的行的数量(或者序号)
filelineno()   #返回当前读取的行的行号,第一行读取之前返回0,最后文件的最后行被读取之后调用,将返回最后一行所在文件的行号
isfirstline()   #检查当前行是否是所在文件的第一行,如果是则返回True,否则False
isstdin()   #如果上一行是从sys.stdin(标准输入)读取的,则返回True,否则False

nextfile()   #关掉当前文件以便从下个文件的第一行开始迭代读取

 

利用fileinput实现文件内容替换,并将原文件作备份:

1 def modify_startupscript(port):
2     for line in fileinput.input(mysql_STARTUP_SCRIPT,inplace=1,backup=.bak):
3         re_datadir = re.compile(rdatadir=, re.I | re.M)
4         content= re_datadir.sub(datadir=/data/mysql/mysql%s/data %port, line)
5         re_basedir = re.compile(rbasedir=, re.I | re.M)
6         print re_basedir.sub(basedir=/usr/local/mysql, content) ,
7     fileinput.close()

 

单个文件内容替换:

1 import fileinput
2 for line in fileinput.input(test.txt,backup=.bak,inplace=1):  
3     print line.replace(Python,LinuxEye),
4 fileinput.close()

 

判断是否是第一行:

1 import fileinput
2 for line in fileinput.input(test.txt):
3     if fileinput.isfirstline():
4         print line,
5     else:
6         break
7 fileinput.close()

 

读取多个文件:

1 import fileinput
2 from glob import glob
3 for line in fileinput.input(glob(rd:/*.txt)):
4     print fileinput.lineno(), u文件:, fileinput.filename(), /
5             u行号:, fileinput.filelineno(), u长度:, len(line.strip(/n))
6 fileinput.close()

 

从标准输入读取内容:

 1 import fileinput
 2 
 3 for line in fileinput.input():
 4     print fileinput.lineno(), u文件:, fileinput.filename(), /
 5             u行号:, fileinput.filelineno(), u长度:, len(line.strip(/n))
 6 fileinput.close()
 7 
 8 cat /etc/passwd |python  readfromfileinput.py
 9 10 python  readfromfileinput.py  < /etc/passwd

 

增加两行内容,实际还是替换:

 1 with  codecs.open(cnf) as fd:
 2         fdlist = [i for i in fd if i]
 3         fdstr = ‘‘.join(fdlist)
 4         restr = re.compile(rwwwdir)
 5         result  = restr.findall(fdstr)
 6 
 7     if not result:
 8         for line in fileinput.input(cnf, inplace=1, backup=.bak):
 9             print line.replace("alias mv=‘mv -i‘",
10                                "alias mv=‘mv -i‘" + 

 + "alias wwwdir=‘cd /usr/local/apache/htdocs‘"),
11         fileinput.close()

 
















以上是关于fileinput模块用法的主要内容,如果未能解决你的问题,请参考以下文章

Python常用标准库之fileinput

Python中fileinput模块使用

Python中fileinput模块介绍

fileinput 模块

Python基础编程——标准库之fileinput与time模块

fileinput模块