python3從零學習-5.4.3、文件輸入流fileinput

源代碼: Lib/fileinput.py


此模塊實現了一個輔助類和一些函數用來快速編寫訪問標準輸入或文件列表的循環。 如果你只想要讀寫一個文件請參閱 open().

典型用法爲:

import fileinput

for line in fileinput.input():

    process(line)

    這將遍歷sys中列出的所有文件的行。argv[1:]如果列表是空的,默認爲sys。如果文件名是'-',它也會被sys.stdin替換。要指定文件名的可選列表,請將其作爲input()的第一個參數傳遞。也允許使用單個文件名。

所有文件都默認以文本模式打開,但你可以通過在調用 input() 或 FileInput 時指定 mode 形參來重載此行爲。 如果在打開或讀取文件時發生了 I/O 錯誤,將會引發 OSError。

在 3.3 版更改: 原來會引發 IOError;現在它是 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語句中的上下文管理器。在本例中,在退出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語句中的上下文管理器。在本例中,在退出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' 並且它會在輸出文件關閉時被刪除。 在讀取標準輸入時原地過濾會被禁用。

此模塊提供了以下兩種打開文件鉤子:

fileinput.hook_compressed(filename, mode)

使用 gzip 和 bz2 模塊透明地打開 gzip 和 bzip2 壓縮的文件(通過擴展名 '.gz' 和 '.bz2' 來識別)。 如果文件擴展名不是 '.gz' 或 '.bz2',文件會以正常方式打開(即使用 open() 並且不帶任何解壓操作)

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

fileinput.hook_encoded(encoding, errors=None)

返回一個通過 open() 打開每個文件的鉤子,使用給定的 encoding 和 errors 來讀取文件

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章