fileinput --- 迭代來(lái)自多個(gè)輸入流的行?

源代碼: Lib/fileinput.py


此模塊實(shí)現(xiàn)了一個(gè)輔助類(lèi)和一些函數(shù)用來(lái)快速編寫(xiě)訪問(wèn)標(biāo)準(zhǔn)輸入或文件列表的循環(huán)。 如果你只想要讀寫(xiě)一個(gè)文件請(qǐng)參閱 open()。

典型用法為:

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

此程序會(huì)迭代 sys.argv[1:] 中列出的所有文件內(nèi)的行,如果列表為空則會(huì)使用 sys.stdin。 如果有一個(gè)文件名為 '-',它也會(huì)被替換為 sys.stdin 并且可選參數(shù) modeopenhook 會(huì)被忽略。 要指定替代文件列表,請(qǐng)將其作為第一個(gè)參數(shù)傳給 input()。 也允許使用單個(gè)文件。

所有文件都默認(rèn)以文本模式打開(kāi),但你可以通過(guò)在調(diào)用 input()FileInput 時(shí)指定 mode 形參來(lái)重載此行為。 如果在打開(kāi)或讀取文件時(shí)發(fā)生了 I/O 錯(cuò)誤,將會(huì)引發(fā) OSError。

在 3.3 版更改: 原來(lái)會(huì)引發(fā) IOError;現(xiàn)在它是 OSError 的別名。

如果 sys.stdin 被使用超過(guò)一次,則第二次之后的使用將不返回任何行,除非是被交互式的使用,或都是被顯式地重置 (例如使用 sys.stdin.seek(0))。

空文件打開(kāi)后將立即被關(guān)閉;它們?cè)谖募斜碇袝?huì)被注意到的唯一情況只有當(dāng)最后打開(kāi)的文件為空的時(shí)候。

反回的行不會(huì)對(duì)換行符做任何處理,這意味著文件中的最后一行可能不帶換行符。

想要控制文件的打開(kāi)方式,你可以通過(guò)將 openhook 形參傳給 fileinput.input()FileInput() 來(lái)提供一個(gè)打開(kāi)鉤子。 此鉤子必須為一個(gè)函數(shù),它接受兩個(gè)參數(shù),filenamemode,并返回一個(gè)以相應(yīng)模式打開(kāi)的文件類(lèi)對(duì)象。 此模塊已經(jīng)提供了兩個(gè)有用的鉤子。

以下函數(shù)是此模塊的初始接口:

fileinput.input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)?

創(chuàng)建一個(gè) FileInput 類(lèi)的實(shí)例。 該實(shí)例將被用作此模塊中函數(shù)的全局狀態(tài),并且還將在迭代期間被返回使用。 此函數(shù)的形參將被繼續(xù)傳遞給 FileInput 類(lèi)的構(gòu)造器。

FileInput 實(shí)例可以在 with 語(yǔ)句中被用作上下文管理器。 在這個(gè)例子中,inputwith 語(yǔ)句結(jié)束后將會(huì)被關(guān)閉,即使發(fā)生了異常也是如此:

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 形參。

下列函數(shù)會(huì)使用 fileinput.input() 所創(chuàng)建的全局狀態(tài);如果沒(méi)有活動(dòng)的狀態(tài),則會(huì)引發(fā) RuntimeError。

fileinput.filename()?

返回當(dāng)前被讀取的文件名。 在第一行被讀取之前,返回 None。

fileinput.fileno()?

返回以整數(shù)表示的當(dāng)前文件“文件描述符”。 當(dāng)未打開(kāi)文件時(shí)(處在第一行和文件之間),返回 -1

fileinput.lineno()?

返回已被讀取的累計(jì)行號(hào)。 在第一行被讀取之前,返回 0。 在最后一個(gè)文件的最后一行被讀取之后,返回該行的行號(hào)。

fileinput.filelineno()?

返回當(dāng)前文件中的行號(hào)。 在第一行被讀取之前,返回 0。 在最后一個(gè)文件的最后一行被讀取之后,返回此文件中該行的行號(hào)。

fileinput.isfirstline()?

如果剛讀取的行是其所在文件的第一行則返回 True,否則返回 False。

fileinput.isstdin()?

如果最后讀取的行來(lái)自 sys.stdin 則返回 True,否則返回 False

fileinput.nextfile()?

關(guān)閉當(dāng)前文件以使下次迭代將從下一個(gè)文件(如果存在)讀取第一行;不是從該文件讀取的行將不會(huì)被計(jì)入累計(jì)行數(shù)。 直到下一個(gè)文件的第一行被讀取之后文件名才會(huì)改變。 在第一行被讀取之前,此函數(shù)將不會(huì)生效;它不能被用來(lái)跳過(guò)第一個(gè)文件。 在最后一個(gè)文件的最后一行被讀取之后,此函數(shù)將不再生效。

fileinput.close()?

關(guān)閉序列。

此模塊所提供的實(shí)現(xiàn)了序列行為的類(lèi)同樣也可用于子類(lèi)化:

class fileinput.FileInput(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)?

類(lèi) FileInput 是一個(gè)實(shí)現(xiàn);它的方法 filename(), fileno(), lineno(), filelineno(), isfirstline(), isstdin(), nextfile()close() 對(duì)應(yīng)于此模塊中具有相同名稱(chēng)的函數(shù)。 此外它還有一個(gè) readline() 方法可返回下一個(gè)輸入行,以及一個(gè) __getitem__() 方法,該方法實(shí)現(xiàn)了序列行為。 這種序列必須以嚴(yán)格的序列順序來(lái)讀寫(xiě);隨機(jī)讀寫(xiě)和 readline() 不可以被混用。

通過(guò) mode 你可以指定要傳給 open() 的文件模式。 它必須為 'r', 'rU', 'U''rb' 中的一個(gè)。

openhook 如果給出則必須為一個(gè)函數(shù),它接受兩個(gè)參數(shù) filenamemode,并相應(yīng)地返回一個(gè)打開(kāi)的文件類(lèi)對(duì)象。 你不能同時(shí)使用 inplaceopenhook

FileInput 實(shí)例可以在 with 語(yǔ)句中被用作上下文管理器。 在這個(gè)例子中,inputwith 語(yǔ)句結(jié)束后將會(huì)被關(guān)閉,即使發(fā)生了異常也是如此:

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 形參。

可選的原地過(guò)濾: 如果傳遞了關(guān)鍵字參數(shù) inplace=Truefileinput.input()FileInput 構(gòu)造器,則文件會(huì)被移至備份文件并將標(biāo)準(zhǔn)輸出定向到輸入文件(如果已存在與備份文件同名的文件,它將被靜默地替換)。 這使得編寫(xiě)一個(gè)能夠原地重寫(xiě)其輸入文件的過(guò)濾器成為可能。 如果給出了 backup 形參 (通常形式為 backup='.<some extension>'),它將指定備份文件的擴(kuò)展名,并且備份文件會(huì)被保留;默認(rèn)情況下擴(kuò)展名為 '.bak' 并且它會(huì)在輸出文件關(guān)閉時(shí)被刪除。 在讀取標(biāo)準(zhǔn)輸入時(shí)原地過(guò)濾會(huì)被禁用。

此模塊提供了以下兩種打開(kāi)文件鉤子:

fileinput.hook_compressed(filename, mode)?

使用 gzipbz2 模塊透明地打開(kāi) gzip 和 bzip2 壓縮的文件(通過(guò)擴(kuò)展名 '.gz''.bz2' 來(lái)識(shí)別)。 如果文件擴(kuò)展名不是 '.gz''.bz2',文件會(huì)以正常方式打開(kāi)(即使用 open() 并且不帶任何解壓操作)。

使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_compressed)

fileinput.hook_encoded(encoding, errors=None)?

返回一個(gè)通過(guò) open() 打開(kāi)每個(gè)文件的鉤子,使用給定的 encodingerrors 來(lái)讀取文件。

使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))

在 3.6 版更改: 添加了可選的 errors 形參。