tempfile --- 生成臨時檔案和目錄¶
原始碼:Lib/tempfile.py
該 module(模組)用於建立臨時檔案和目錄,它可以在所有有支援的平臺上使用。TemporaryFile、NamedTemporaryFile、TemporaryDirectory 和 SpooledTemporaryFile 是有自動清除功能的高階介面,可作為情境管理器 (context manager) 使用。mkstemp() 和 mkdtemp() 是低階函式,使用完畢後需手動清理。
所有可被使用者呼叫的函式和建構函式都帶有可以設定臨時檔案和臨時目錄的路徑和名稱的引數。此 module 所使用的檔名為一個隨機字元組成的字串,這讓檔案可以更安全地在共享的臨時目錄中被建立。為了維持向後相容性,引數的順序會稍微奇怪,所以為了讓程式更容易被理解,建議使用關鍵字引數。
這個 module 定義了以下可供使用者呼叫的項目:
- tempfile.TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)¶
回傳一個可當作臨時儲存區域的類檔案物件。建立該檔案使用了與
mkstemp()相同的安全規則。它將在關閉(包括當物件被垃圾回收 (garbage collect) 時的隱式關閉)後立即銷毀。在 Unix 下,該檔案所在的目錄可能根本不被建立、或者在建立檔案後立即就被刪除,其他平臺不支援此功能;你的程式不應依賴使用此功能建立的臨時檔案名稱,因為它在檔案系統中的名稱有可能是不可見的。生成的物件可以作為情境管理器使用(參見 範例)。完成情境或銷毀臨時檔案物件後,臨時檔案將從檔案系統中刪除。
mode 參數預設為
'w+b',所以建立的檔案不用關閉就可以讀取或寫入。因為用的是二進位制模式,所以無論存的是什麼資料,它在所有平臺上的行為都一致。buffering、encoding、errors 和 newline 的含義與open()中的相同。參數 dir、prefix 和 suffix 的含義和預設值都與它們在
mkstemp()中的相同。在 POSIX 平臺上,回傳物件是真實的檔案物件。在其他平臺上,它是一個 file-like object,它的
file屬性為底層的真實檔案物件。如果可用且可運作,則使用
os.O_TMPFILE旗標(僅限於 Linux,需要 3.11 版本以上的核心)。在不是 Posix 或 Cygwin 的平臺上,TemporaryFile 是 NamedTemporaryFile 的別名。
引發一個附帶引數
fullpath的tempfile.mkstemp稽核事件。在 3.5 版的變更: 如果可用,自此開始使用
os.O_TMPFILE旗標。在 3.8 版的變更: 新增 errors 參數。
- tempfile.NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None, delete_on_close=True)¶
此函式的操作與
TemporaryFile()完全相同,但存在以下差異:此函式回傳一個保證在檔案系統中具有可見名稱的檔案。
為了管理指定檔案,它使用 delete 和 delete_on_close 參數擴充
TemporaryFile()來指定是否以及如何自動刪除指定檔案。
回傳的物件始終是一個類檔案物件,其
file屬性是底層的真實檔案物件。這個類檔案物件可以在with陳述式中使用,就像普通檔案一樣。臨時檔案的名稱可以從回傳的類檔案物件的name屬性中取得。在 Unix 上則與TemporaryFile()不同,目錄條目不會在檔案建立後立即被取消鏈接 (unlink)。如果 delete 為 true(預設值)並且 delete_on_close 為 true(預設值),則檔案在關閉後會立即被刪除。如果 delete 為 true 並且 delete_on_close 為 false,則僅在情境管理器退出時刪除檔案,或者在類檔案物件完結時刪除檔案。在這種情況下,並不總是保證能成功刪除(請參閱
object.__del__())。如果 delete 為 false,則會忽略 delete_on_close 的值。因此,要在關閉檔案後使用臨時檔案的名稱重新打開檔案,請確保在關閉時不刪除檔案(將 delete 參數設定為 false),或者如果臨時檔案是以
with陳述式建立,要將 delete_on_close 參數設定為 false。建議使用後者,因為它有助於在情境管理器退出時自動清理臨時檔案。在臨時檔案仍處於打開狀態時再次按其名稱打開它,其作用方式如下:
在 POSIX 上,檔案始終可以再次打開。
在 Windows 上,確保至少滿足以下條件之一:
delete 為 false
額外的 open 會共享刪除存取權限(例如,透過使用旗標
O_TEMPORARY來呼叫os.open())delete 為 true 但 delete_on_close 為 false。請注意,在這種情況下不共享刪除存取權限的其他 open(例如透過內建的
open()建立)必須在退出情境管理器之前關閉,否則情境管理器上的os.unlink()呼叫退出將失敗並出現PermissionError。
在 Windows 上,如果 delete_on_close 為 false,並且檔案是在使用者缺乏刪除存取權限的目錄中建立的,則情境管理器退出時的
os.unlink()呼叫將失敗,並引發PermissionError。當 delete_on_close 為 true 時,不會發生這種情況,因為刪除存取權限是由 open 來要求的,如果未授予存取權限則會立即失敗。(僅)在 POSIX 上,因使用 SIGKILL 而被終止的行程無法自動刪除它建立的任何 NamedTemporaryFiles。
引發一個附帶引數
fullpath的tempfile.mkstemp稽核事件。在 3.8 版的變更: 新增 errors 參數。
在 3.12 版的變更: 新增 delete_on_close 參數。
- class tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)¶
此類別執行的操作與
TemporaryFile()完全相同,但會將資料排存 (spool) 於在記憶體中,直到檔案大小超過 max_size,或檔案的fileno()方法被呼叫為止,此時資料會被寫入磁碟,並且之後的操作與TemporaryFile()相同。- rollover()¶
生成的檔案物件有一個額外的方法
rollover(),忽略檔案大小並立即將其寫入磁碟。
回傳的物件是 file-like object,它的
_file屬性是io.BytesIO或io.TextIOWrapper物件(取決於指定的是二進位制模式還是文字模式)或真實的檔案物件(取決於是否已呼叫rollover())。file-like object 可以像普通檔案一樣在with陳述式中使用。在 3.3 版的變更: 現在,檔案的截斷方法 (truncate method) 可接受一個 size 引數。