fileinput --- 迭代來自多個輸入流的行?
源代碼: Lib/fileinput.py
此模塊實現了一個輔助類和一些函數用來快速編寫訪問標準輸入或文件列表的循環。 如果你只想要讀寫一個文件請參閱 open()。
典型用法為:
import fileinput
for line in fileinput.input():
process(line)
此程序會迭代 sys.argv[1:] 中列出的所有文件內的行,如果列表為空則會使用 sys.stdin。 如果有一個文件名為 '-',它也會被替換為 sys.stdin 并且可選參數 mode 和 openhook 會被忽略。 要指定替代文件列表,請將其作為第一個參數傳給 input()。 也允許使用單個文件。
所有文件都默認以文本模式打開,但你可以通過在調用 input() 或 FileInput 時指定 mode 形參來重載此行為。 如果在打開或讀取文件時發生了 I/O 錯誤,將會引發 OSError。
如果 sys.stdin 被使用超過一次,則第二次之后的使用將不返回任何行,除非是被交互式的使用,或都是被顯式地重置 (例如使用 sys.stdin.seek(0))。
空文件打開后將立即被關閉;它們在文件列表中會被注意到的唯一情況只有當最后打開的文件為空的時候。
反回的行不會對換行符做任何處理,這意味著文件中的最后一行可能不帶換行符。
想要控制文件的打開方式,你可以通過將 openhook 形參傳給 fileinput.input() 或 FileInput() 來提供一個打開鉤子。 此鉤子必須為一個函數,它接受兩個參數,filename 和 mode,并返回一個以相應模式打開的文件類對象。 此模塊已經提供了兩個有用的鉤子。
以下函數是此模塊的初始接口:
-
fileinput.input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)? 創建一個
FileInput類的實例。 該實例將被用作此模塊中函數的全局狀態,并且還將在迭代期間被返回使用。 此函數的形參將被繼續傳遞給FileInput類的構造器。FileInput實例可以在with語句中被用作上下文管理器。 在這個例子中,input 在with語句結束后將會被關閉,即使發生了異常也是如此:with fileinput.input(files=('spam.txt', 'eggs.txt')) as f: for line in f: process(line)
在 3.2 版更改: 可以被用作上下文管理器。
Deprecated since version 3.6, will be removed in version 3.8: bufsize 形參。
下列函數會使用 fileinput.input() 所創建的全局狀態;如果沒有活動的狀態,則會引發 RuntimeError。
-
fileinput.filename()? 返回當前被讀取的文件名。 在第一行被讀取之前,返回
None。
-
fileinput.fileno()? 返回以整數表示的當前文件“文件描述符”。 當未打開文件時(處在第一行和文件之間),返回
-1。
-
fileinput.lineno()? 返回已被讀取的累計行號。 在第一行被讀取之前,返回
0。 在最后一個文件的最后一行被讀取之后,返回該行的行號。
-
fileinput.filelineno()? 返回當前文件中的行號。 在第一行被讀取之前,返回
0。 在最后一個文件的最后一行被讀取之后,返回此文件中該行的行號。
-
fileinput.isfirstline()? 如果剛讀取的行是其所在文件的第一行則返回
True,否則返回False。
-
fileinput.isstdin()? 如果最后讀取的行來自
sys.stdin則返回True,否則返回False。
-
fileinput.nextfile()? 關閉當前文件以使下次迭代將從下一個文件(如果存在)讀取第一行;不是從該文件讀取的行將不會被計入累計行數。 直到下一個文件的第一行被讀取之后文件名才會改變。 在第一行被讀取之前,此函數將不會生效;它不能被用來跳過第一個文件。 在最后一個文件的最后一行被讀取之后,此函數將不再生效。
-
fileinput.close()? 關閉序列。
此模塊所提供的實現了序列行為的類同樣也可用于子類化:
-
class
fileinput.FileInput(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)? 類
FileInput是一個實現;它的方法filename(),fileno(),lineno(),filelineno(),isfirstline(),isstdin(),nextfile()和close()對應于此模塊中具有相同名稱的函數。 此外它還有一個readline()方法可返回下一個輸入行,以及一個__getitem__()方法,該方法實現了序列行為。 這種序列必須以嚴格的序列順序來讀寫;隨機讀寫和readline()不可以被混用。通過 mode 你可以指定要傳給
open()的文件模式。 它必須為'r','rU','U'和'rb'中的一個。openhook 如果給出則必須為一個函數,它接受兩個參數 filename 和 mode,并相應地返回一個打開的文件類對象。 你不能同時使用 inplace 和 openhook。
FileInput實例可以在with語句中被用作上下文管理器。 在這個例子中,input 在with語句結束后將會被關閉,即使發生了異常也是如此:with FileInput(files=('spam.txt', 'eggs.txt')) as input: process(input)
在 3.2 版更改: 可以被用作上下文管理器。
3.4 版后已移除:
'rU'和'U'模式。Deprecated since version 3.6, will be removed in version 3.8: bufsize 形參。
可選的原地過濾: 如果傳遞了關鍵字參數 inplace=True 給 fileinput.input() 或 FileInput 構造器,則文件會被移至備份文件并將標準輸出定向到輸入文件(如果已存在與備份文件同名的文件,它將被靜默地替換)。 這使得編寫一個能夠原地重寫其輸入文件的過濾器成為可能。 如果給出了 backup 形參 (通常形式為 backup='.<some extension>'),它將指定備份文件的擴展名,并且備份文件會被保留;默認情況下擴展名為 '.bak' 并且它會在輸出文件關閉時被刪除。 在讀取標準輸入時原地過濾會被禁用。
此模塊提供了以下兩種打開文件鉤子:
