Python第二十一天 fileinput模块
fileinput模块
fileinput.input([files[,inplace[,backup[,bufsize[,mode[,openhook]]]]]])
files: #文件的路径列表,默认是stdin方式,多文件['1.txt','2.txt',...]
inplace: #是否将标准输出的结果写回文件,默认不取代,只能替换文件内容,不能增加内容
backup: #备份文件的扩展名,只指定扩展名,如.bak。如果该文件的备份文件已存在,则会自动覆盖。
bufsize: #缓冲区大小,默认为0,如果文件很大,可以修改此参数,一般默认即可
mode: #读写模式,默认为只读
openhook: #该钩子用于控制打开的所有文件,比如说编码方式等;
fileinput模块提供处理一个或多个文本文件的功能,可以通过使用for循环来读取一个或多个文本文件的所有行。
它的工作方式和readlines很类似,不同点在于它不是将全部的行读到列表中而是创建了一个xreadlines对象。
关键在这句话:标准输出会被重定向到打开文件
所以一定要用print打印到标准输出,fileinput会自动把标准输出内容回写到文件,如果没有用print打印到标准输出,那么就会把空内容回写到文件,也就是清除了文件所有内容
print re_basedir.sub('basedir=/usr/local/MysqL',line),
下面是fileinput模块中的常用函数:
input() #返回能够用于for循环遍历的对象
filename() #返回当前文件的名称
fileno() #返回当前文件的文件描述符
lineno() #返回当前已经读取的行的数量(或者序号)
filelineno() #返回当前读取的行的行号
isfirstline() #检查当前行是否是文件的第一行
isstdin() #是不是从标准输入读取内容
#如果要修改多个地方,将sub()得到的结果代入第二个sub()函数再print出来
def modify_startupscript(port): for line in fileinput.input(MysqL_STARTUP_SCRIPT,inplace=1,backup='.bak'): re_datadir = re.compile(r'datadir=',re.I | re.M) content= re_datadir.sub(datadir=/data/MysqL/MysqL%s/data' %port,line) re_basedir = re.compile(rbasedir= re.M) print re_basedir.sub(basedir=/usr/local/MysqL',content),fileinput.close()
#!/usr/bin/env python import fileinput in fileinput.input(test.txt.bak): print line.replace(PythonLinuxEye),fileinput.close()
判断是否是第一行
): if fileinput.isfirstline(): print line,else: break fileinput.close()
读取多个文件
from glob glob in fileinput.input(glob(rd:/*.txt)): print fileinput.lineno(),u文件: u行号:长度:/n)) fileinput.close()
从标准输入读入内容
fileinput in fileinput.input(): )) fileinput.close() cat /etc/passwd |python readfromfileinput.py 或 python readfromfileinput.py < /etc/passwd
with codecs.open(cnf) as fd: fdlist = [i for i in fd i] fdstr = ''.join(fdlist) restr = re.compile(rwwwdir) result = restr.findall(fdstr) if not result: in fileinput.input(cnf,1)">): "alias mv='mv -i'"" + \n\n' + alias wwwdir='cd /usr/local/apache/htdocs'