首頁 > 軟體

Python臨時檔案建立之tempfile模組介紹

2022-03-20 22:00:19

一、tempfile模組簡介

1、tempfile模組應用場景

Pythontempfile模組是用來建立臨時檔案或者資料夾的跨平臺工具。在大型資料處理專案中,有的處理結果是不需要向用戶最終展示的,但是它們的應用又是貫穿專案始終的,在這種情況下,我們就需要使用tempfile模組來解決這種問題。

2、tempfile模組的方法

tempfile模組主要包括三類函數:

  • (1)四個高階介面:TemporaryFileNamedTemporaryFileSpooledTemporaryFileTemporaryDirectory,這四個高階介面提供了自動清除功能並且可以作為上下文管理器使用。
函數名描述
TemporaryFile和NamedTemporaryFile高階臨時檔案物件建立函數
SpooledTemporaryFile假離線模式高階臨時檔案物件建立函數
TemporaryDirectory高階臨時目錄建立函數
  • (2)另外,兩個底層函數mkstemp()mkdtemp(),用於生成臨時底層的臨時檔案和資料夾,在使用完它們的時候需要手動清除。
函數名描述
mkstemp()底層臨時檔案建立函數
mkdtemp()底層臨時目錄建立函數
  • (3)最後,tempfile模組還有一些針對檔案、資料夾屬性的操作函數gettempdir()gettempdirb()gettempprefixgettempprefixb
函數名描述
gettempdir()以文字格式返回臨時資料夾名函數
gettempdirb()以二進位制格式返回臨時資料夾名函數
gettempprefix以文字格式返回臨時檔名字首
gettempprefixb以二進位制格式返回臨時檔名字首

tempfile的所有使用者可呼叫函數和建構函式都帶有額外引數,通過這些引數可以實現對臨時檔案目錄和位置的管理。此模組會在共用臨時目錄中安全地建立臨時檔案,並給建立臨時文隨機起個名。

二、tempfile模組主要函數介紹

高階臨時檔案物件建立函數:Temporaryfile和NamedTemporaryFile

1、Temporaryfile函數

Temporaryfile函數返回一個類檔案物件用作臨時儲存區,它使用與mkstemp()函數相同規則的安全重建檔案模式,它一關閉就會被銷燬(包括針對垃圾收集物件的隱式關閉)。需要注意的是,在Unix系統環境,檔案的目錄要麼根本不建立,要麼在檔案建立後立即刪除。也就是說,程式碼不會依賴於此函數建立的臨時檔案,包括它們的名稱,這也是這個函數與NamedTemporaryfile函數的不同之處。

TemporaryFile函數的呼叫格式為:

TemporaryFile(mode='w+b', buffering=-1, encoding=None,
    newline=None, suffix=None, prefix=None, *, error=None)

函數引數選項:

  • (1)mode引數:預設為w+r,以便檔案在被建立時可以執行讀寫操作。
  • (2)buffering、encoding、errors和newline引數:用於解釋open()函數行為。
  • (3) dir、prefix和suffix引數:與mkstemp()具有相同的含義和預設設定。

下面給出一個典型例子:

import tempfile

# 下面建立一個臨時檔案並寫入一些資料
fp = tempfile.TemporaryFile()
fp.write(bb'Hello Xiaoliang!')

# 讀取資料
fp.seek(0);  fp.read()

另外,該函數生成的物件可以用作上下文管理器(參見範例)。完成上下文管理或銷燬檔案物件後,臨時檔案將從檔案系統中刪除。

import tempfile

with tempfile.TemporaryFile() as fp:
    fp.write(b'Hello Xiaoliang!')
    fp.seek(0)
    fp.read()

2、NamedTemporaryfile函數

除了NamedTemporaryfile()函數實現了在檔案系統中只有一個可見名之外,其作用與TemporaryFile()功能完全相同。執行完該函數後,我們可以從返回的類檔案物件的name屬性中檢索檔名稱。在Unix系統上,在命名的臨時檔案處於開啟狀態時,可以使用該名稱開啟生成的檔案。

NamedTemporaryFile函數的呼叫格式與TemporaryFile函數的非常相似,唯一不同的是具有了一個delete引數:

NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
    newline=None, suffix=None, prefix=None, dir=Nonde, delete=True,
    *, error=None)

delete引數選項:如果該引數為True(預設),則檔案一關閉則被刪除。返回的物件始終是一個類檔案物件,其檔案屬性是底層的真實檔案物件。也就是說,這個類檔案物件可以在with上下文管理中使用,就像普通檔案一樣。

3、假離線模式高階臨時檔案物件建立函數:SpooledTemporaryfile

SPOOL技術簡介:

SPOOL是Simultaneous Peripheral Operation On-Line
(即外部裝置聯機並行操作)的縮寫,它是關於慢速字元裝置如何與計算機主機交換資訊的一種技術,通常稱為“假離線技術”。其實,嚴格意義上說,SPOOL系統既不同於離線方式,也不同於直接耦合方式,SPOOL技術實際上是一種外圍裝置同時聯機操作技術,又稱為排隊轉儲技術。它在輸入和輸出之間增加了“輸入井”和“輸出井”的排隊轉儲環節,以消除使用者的“聯機”等待時間。

SpooledTemporaryFile()函數除了資料會在記憶體中進行假離線外,與TemporaryFile()完全相同。直到檔案大小超過max_size或直到呼叫檔案的fileno()方法,此時使用與TemporaryFile()一樣的操作,將內容寫入磁碟。

該函數同樣返回一個類檔案物件,其_file屬性可以是io.BytesIO(二進位制模式)、io.TextIOWrapper(文字模式)物件或真實的檔案物件(呼叫roller()函數)。同樣的,這個類檔案物件可以在with上下文管理中使用,就像普通檔案一樣。

該函數還有一個額外的方法rollover(),它使建立的檔案滾尋磁碟上的內容,而不管其大小。SpooledTemporaryFile函數的呼叫格式與TemporaryFile()函數一樣,這裡就不介紹了。

4、高階臨時目錄建立函數:TemporaryDirectory

TemporaryDirectory函數使用與mkdtemp()相同的規則安全地建立臨時目錄。生成的物件可以用作上下文管理器(這裡給出範例)。完成上下文或銷燬臨時目錄物件後,新建立的臨時目錄及其所有內容將從檔案系統中刪除。其呼叫格式如下所示:

TemporaryDirectory(suffix=None, prefix=None, dir=None)

呼叫該函數後,建立的目錄名可以從返回物件的name屬性中檢索到。當返回的物件作為上下文管理器時,該名稱將被分配給with語句中as子句的目標。另外,可以通過呼叫cleanup()方法顯式清理目標。

5、底層臨時檔案/目錄建立函數:mkstemp和mkdtemp

底層臨時檔案建立函數mkstemp()

mkstemp()函數以儘可能安全的方式建立臨時檔案,與TemporaryFile()函數不同,使用者需要負責臨時檔案的刪除。其呼叫格式如下所示:

mkstemp(suffix=None, prefix=None, dir=None, text=False)

函數引數選項:

  • (1)suffix:檔案字尾,預設為None。如果不是None,檔名將以設定的字尾結尾。注意,mkstemp()函數不會在檔名和字尾之間加一個點,如果需要可以自行新增。
  • (2)prefix:檔案字首,預設為None。如果不是None,檔案以該字首為開頭;否則使用預設字首,預設的字首是由gettempprefix()或gettempprefixb()的返回值確定。
  • (3)dir:檔案建立的目錄,預設為None,如果不是None,則使用預設目錄;預設目錄是從所使用的系統列表中選擇的,但是使用者可以通過設定TMPDIR、TEMP或TMP環境變數來控制目錄位置。
  • (4)text:文字型別,預設為False,即以二進位制模式開啟。如果為true,則以文字格式開啟。

mkstemp()返回一個元組,該元組包含一個用於開啟檔案的作業系統級別(OS-leve)控制程式碼(有os.open()函數返回)和該檔案絕對路徑名。

底層臨時目錄建立函數mkdtemp()

mkdtemp()函數以儘可能安全的方式建立臨時目錄。只有通過使用者ID才能讀取、寫入和搜尋目錄,同時使用者負責刪除臨時目錄及其內容。其呼叫格式和引數與mkstemp()相同,這裡就不展開介紹了。注意,mkdtemp()函數只返回新建目錄的絕對路徑。

三、tempfile模組的檔案/資料夾屬性操作函數

1、返回臨時資料夾名函數:gettempdir和gettempdirb

gettempdir()返回存放臨時檔案的資料夾名字,該函數的返回值是tempfile內的全域性變數,也就是說,gettempdir()返回的資料夾名將作為tempfile模組中的所有函數dir引數的預設值。

Python內部搜尋一個標準目錄列表,使用者可以在其中建立檔案的目錄:

  • (1)由TMPDIR環境變數命名的目錄;
  • (2)由TEMP環境變數命名的目錄;
  • (3)由TMP環境變數命名的目錄。
  • (4)不同平臺特定的位置:

Windows系統,目錄為:C:TEMP, C:TMP, TEMP, and TMP;
其他系統,目錄為:/tmp, /var/tmp, and /usr/tmp。

  • (5)當前工作目錄。

另外,還有一個與gettempdir()作用相同,只是返回的格式二進位制的函數gettempdirb()。

2、返回臨時檔案字首函數:gettempprefix和gettempprefix

gettempprefix以文字格式返回建立的臨時檔案的字首;gettempprefixb以二進位制格式返回建立的臨時檔案的字首。

到此這篇關於Python臨時檔案建立之tempfile模組介紹的文章就介紹到這了,更多相關臨時檔案與tempfile模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com