Python第二十一天 fileinput模塊

Python第二十一天    fileinput模塊python

 


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) ,


mysql

下面是fileinput模塊中的經常使用函數:
input() #返回可以用於for循環遍歷的對象
filename() #返回當前文件的名稱
fileno() #返回當前文件的文件描述符
lineno() #返回當前已經讀取的行的數量(或者序號)
filelineno() #返回當前讀取的行的行號
isfirstline() #檢查當前行是不是文件的第一行
isstdin() #是否是從標準輸入讀取內容sql





#若是要修改多個地方,將sub()獲得的結果代入第二個sub()函數再print出來apache

利用fileinput實現文件內容替換,並將原文件做備份函數

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(r'basedir=', re.I | re.M)
        print re_basedir.sub('basedir=/usr/local/mysql', content) ,
    fileinput.close()

 


   

單個文件內容替換編碼

#!/usr/bin/env python
import fileinput
for line in fileinput.input('test.txt',backup='.bak',inplace=1):  
    print line.replace('Python','LinuxEye'),
fileinput.close()

 


    
    

判斷是不是第一行spa

import fileinput
for line in fileinput.input('test.txt'):
    if fileinput.isfirstline():
        print line,
    else:
        break
fileinput.close()
        

 


  

讀取多個文件rest

import fileinput
from glob import glob
for line in fileinput.input(glob(r'd:/*.txt')):
    print fileinput.lineno(), u'文件:', fileinput.filename(), /
            u'行號:', fileinput.filelineno(), u'長度:', len(line.strip('/n'))
fileinput.close()

 

 

從標準輸入讀入內容code

import fileinput

for line in fileinput.input():
    print fileinput.lineno(), u'文件:', fileinput.filename(), /
            u'行號:', fileinput.filelineno(), u'長度:', len(line.strip('/n'))
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 if i]
        fdstr = ''.join(fdlist)
        restr = re.compile(r'wwwdir')
        result  = restr.findall(fdstr)

    if not result:
        for line in fileinput.input(cnf, inplace=1, backup='.bak'):
            print line.replace("alias mv='mv -i'",
                               "alias mv='mv -i'" + '\n\n' + "alias wwwdir='cd /usr/local/apache/htdocs'"),
        fileinput.close()
相關文章
相關標籤/搜索