fileinput模塊用法


 

  • fileinput模塊功能:

提供拼接一個或多個文本文件的功能,可以通過使用for循環來讀取一個或多個文本文件的所有行,從而進行逐行處理(如進行顯示、替換、添加行號等)。

其功能類似於linux命令的cat和sed。

input方法是fileinput模塊的主要方法,input方法的參數將傳遞給FileInput類的構造器來創建FileInput類的一個實例(對象),該實例是一個迭代器,可用於for等迭代環境中,當然也可以用next()、__next__()方法,也支持readline()方法:

>>> obj_fi=fileinput.input(r'd:\syslogin.log') >>> type(obj_fi) <class 'fileinput.FileInput'>
>>> print(obj_fi) <fileinput.FileInput object at 0x00A5FE90>
>>> dir(obj_fi) ['__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_backup', '_backupfilename', '_file', '_filelineno', '_filename', '_files', '_inplace', '_isstdin', '_mode', '_openhook', '_output', '_readline', '_savestdout', '_startlineno', 'close', 'filelineno', 'filename', 'fileno', 'isfirstline', 'isstdin', 'lineno', 'nextfile', 'readline'] >>>

 

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:               #該鈎子用於控制打開的所有文件,比如說編碼方式等;

 

input方法的說有參數都為關鍵字參數,在不帶任何參數情況下,將使用命令行列出的所有文件(命令行參數列表:sys.argv[1:]),如果命令行也沒有參數,則文件默認為 標准輸入( sys.stdin),如果文件名為'-',也使用標准輸入sys.stdin.。通常指定一個文件名列表作為input()方法的第一個參數,當然單個文件名也是允許的,也可以使用files=(‘file1‘,‘’file2‘’)格式傳遞文件名。下面是使用標准輸入作為文件名的使用格式:

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

 

從3.2版本開始,fileinput實例可以用於上下文管理器,如:

with fileinput.input(files=('spam.txt', 'eggs.txt')) as f: for line in f: process(line)

 

特別注意:關鍵字參數 inplace=True的使用

1、如果傳遞了inplace=True關鍵字參數,則標准輸出會被重定向為打開的文件,但例外的的是:如果傳入的文件為標准輸入,則該替換功能自動被禁用。

2、對於非標准輸入文件,將用backup='.<some extension>'關鍵字指定的值(缺省為'.bak')作為擴展名重命名(相當於用linux的move命令)原文件,如果先前已經存在重命名的文件則直接無提示替換,同時自動將標准輸出重定向為原輸入文件,這就能夠輕松的修改原文件,所以一定要用print打印到標准輸出,如果沒有用print打印到標准輸出,就會把空內容回寫到文件,也就是清除了文件所有內容。

 

  • fileinput模塊的常用方法:

input()         #模塊的主要方法,返回能夠用於for循環遍歷的對象,該對象可迭代
filename()   #返回當前正在讀取的文件名,如果第一行被讀取之前調用將返回None
fileno()        #返回當前文件的文件描述符(1個整數),沒有文件被打開(第一行之前或文件之間的時刻)將返回-1
lineno()       #返回當前已經累加讀取的行的數量(或者序號)
filelineno()     #返回當前讀取的行的行號,第一行讀取之前返回0,最后文件的最后行被讀取之后調用,將返回最后一行所在文件的行號
isfirstline()     #檢查當前行是否是所在文件的第一行,如果是則返回True,否則False
isstdin()      #如果上一行是從sys.stdin(標准輸入)讀取的,則返回True,否則False

nextfile()   #關掉當前文件以便從下個文件的第一行開始迭代讀取

 

單個文件內容簡單替換:

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 import re 3 obj_fileinput=fileinput.input(r'd:\test.txt',inplace=True,backup='.bak') 4 for line in obj_fileinput: 5     obj_re1 = re.compile(r'\bsubstitute\b', re.I | re.M) 6     content= obj_re1.sub('substitute has been replace' , line) 7     obj_re2 = re.compile(r'\breplace\b', re.I | re.M) 8     print(obj_re2.sub('in place', content)) 9 fileinput.close()

 

判斷是否是第一行:

1 import fileinput 2 for line in fileinput.input(r'd:\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(), u'行號:', fileinput.filelineno()) 6 fileinput.close()

 

從標准輸入讀取內容:

 1 import fileinput  2 
 3 for line in fileinput.input():  4     print(fileinput.lineno(),': ', line)  6 fileinput.close()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM