fileinput模塊能處理來自一個或多個文件的輸入。
自動讀取命令行參數(由sys.argv)並將其視為輸入文件的列表 --> 按順序讀取數據行
【例1】drop2hash.py的作用是剔除所有以“##”開頭的行
import fileinput
def main():
for line in fileinput.input():
if not line.startswith('##'):
print(line, end="")
main()
現假定有兩個數據文件
sole1.tst
## sole1.tst: test data for the sole function
0 0 0
0100 0
##
0100100
sole2.tst
## sole2.tst: more test data for the sole function
12 15 0
##
100100 0
執行 python3 drop2hash.py sole1.tst sole2.tst
結果將會把這兩個文件的數據拼接起來,並剔除所有的注釋行
# python3 drop2hash.py sole1.tst sole2.tst
0 0 0
0100 0
0100100
12 15 0
100100 0
該模塊還提供了很多其他函數,可隨時了解已讀取的總行數(lineno)、已從當前文件讀取的行數(filelineno)、當前文件名(filename)、當前行是否為文件的首行(isfirstline)、是否正從標准輸入讀取(isstdin)。還可隨時跳到下一個文件(nextfile)或關閉整個文件流(close)。
【例2】linestatistics.py 把輸入文件中的文本行拼接起來,並加上文件開始分界符,同時統計行數
import fileinput
def main():
for line in fileinput.input():
if fileinput.isfirstline():
print("<start of file {0}>".format(fileinput.filename()))
print("Progress>>> curent file lines: ",fileinput.filelineno(),
" total lines: ",fileinput.lineno())
main()
python3 linestatistics.py sole1.tst sole2.tst的執行結果如下
# python3 linestatistics.py sole1.tst sole2.tst
<start of file sole1.tst>
Progress>>> curent file lines: 1 total lines: 1
Progress>>> curent file lines: 2 total lines: 2
Progress>>> curent file lines: 3 total lines: 3
Progress>>> curent file lines: 4 total lines: 4
Progress>>> curent file lines: 5 total lines: 5
<start of file sole2.tst>
Progress>>> curent file lines: 1 total lines: 6
Progress>>> curent file lines: 2 total lines: 7
Progress>>> curent file lines: 3 total lines: 8
Progress>>> curent file lines: 4 total lines: 9
如果調用fileinput.input時帶了一個文件名或文件名列表作為參數,這些文件就會被用作輸入文件,而不再采用sys.argv中的參數。fileinput.input還有一個可選參數inplace,可將輸出結果存回輸入文件中,同時將原始文件保留為備份文件。
【例3】addlinenum.py 內容如下,fileinput.input時帶文件名
import fileinput
with fileinput.input(files="sole1.tst",inplace=False) as f:
for line in f:
line = line.strip()
num = fileinput.lineno()
print("#{0} {1}".format(num, line))
執行 python3 addlinenum.py 打屏如下,inplace=False 輸入文件sole1.tst內容不變
#1 ## sole1.tst: test data for the sole function
#2 0 0 0
#3 0100 0
#4 ##
#5 0100100
將addlinenum.py 內容修改如下,inplace=True,backup="solebk",不打屏,直接修改源文件;備份源文件到sole1.tstsolebk;如果不提供backup參數則不備份
[[email protected] ~]# cat addlinenum.py
import fileinput
with fileinput.input(files="sole1.tst",inplace=True,backup="solebk") as f:
for line in f:
line = line.strip()
num = fileinput.lineno()
print("#{0} {1}".format(num, line))
[[email protected] ~]#
============================================================
[[email protected] ~]# cat sole1.tst
## sole1.tst: test data for the sole function
0 0 0
0100 0
##
0100100
[[email protected] ~]#
[[email protected] ~]# python3 addlinenum.py
[[email protected] ~]#
[[email protected] ~]# ls -l sole1*
-rw-r--r-- 1 root root 85 Jul 3 11:32 sole1.tst
-rw-r--r-- 1 root root 70 Jul 3 11:32 sole1.tstsolebk
[[email protected] ~]#
[[email protected] ~]# cat sole1.tst
#1 ## sole1.tst: test data for the sole function
#2 0 0 0
#3 0100 0
#4 ##
#5 0100100
[[email protected] ~]#
[[email protected] ~]# cat sole1.tstsolebk
## sole1.tst: test data for the sole function
0 0 0
0100 0
##
0100100
[[email protected] ~]#
參考資料:
Python常用標准庫之fileinput https://www.cnblogs.com/nykuo/p/13024272.html
《Python 快速入門(第3版)》11.1.5 fileinput模塊的使用