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(r‘datadir=‘, re.I | re.M) 4 content= re_datadir.sub(‘datadir=/data/mysql/mysql%s/data‘ %port, line) 5 re_basedir = re.compile(r‘basedir=‘, 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(r‘d:/*.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(r‘wwwdir‘) 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模块用法的主要内容,如果未能解决你的问题,请参考以下文章