1. 程式人生 > >Python基礎學習:tempfile模組

Python基礎學習:tempfile模組

資原始碼:Lib/tempfile.py

    該模組用於建立臨時檔案和目錄。它在所有支撐平臺上都可以工作。TemporaryFile、NamedTemporaryFile、TemporaryDirectory和SpooledTemporaryFile是提供自動化清理的高階介面,也可用作上下文管理器。mkstemp()和mkdtemp()是低階函式,並且需要手動清理。

    所有的使用者可呼叫的函式和構造器都提供了額外的菜蔬,以允許直接控制臨時檔案的名稱與目錄的位置。被該模組使用的檔名包括由隨機字元組成的字串,這種方法使得檔案可以被安全的在共享的臨時目錄中被建立。為了維持向後相容性,使得引數順序存在一些奇妙之處;因此為了保證清晰,請使用關鍵字引數。

    該模組定義了以下使用者可呼叫項:

tempfile. TemporaryFile(mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=none, prefix=None, dir=None)

    返回一個file-like object物件,該物件可以被用作為一個臨時儲存區域。檔案被安全的建立,與mkstemp()使用相同的規則。建立的檔案會在其被關閉後銷燬(包含隱含的關閉情況,即當該物件被當做垃圾回收時)。在Unix下,檔案的目錄項要麼不被建立,要麼在檔案被建立後立刻銷燬。其它平臺不支援這個;你的程式碼不應該依靠一個使用該檔案建立的、無論是否包含檔案系統中的可見名的臨時檔案。

    結果物件可以被用作一個上下文管理器。在完成檔案物件的上下文或銷燬時,臨時檔案就會被從檔案系統中移除。

    引數mode預設為’w+b’,因此被建立的檔案可以在未被關閉的情況下進行讀和寫。使用二進位制模式確保了它的行為在所有平臺上始終保持一致,無論資料是怎樣儲存的。buffering、encoding和newline的解釋如同open()函式中一樣。

    dir、prefix和suffix引數的含義與mkstemp()中的同名引數相同,且預設值一致。

    被返回的物件是一個位於POSIX平臺上的真實檔案物件。在其它平臺上,它是一個類檔案物件,且其file屬性是一個潛在的真實檔案物件。

    os.O_TMPFILE標誌可以在其可用且可工作時使用。

tempfile. NamedTemporaryFile(mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, dir=None, delete=True)

    返回一個類檔案物件,該物件可被用做為一個臨時儲存區域。該檔案備被安全的建立,使用與mkstemp()相同的規則。當該檔案被關閉時(包括當該物件被當做垃圾回收時的隱含關閉),它將被銷燬。在Unix下,檔案的目錄項要麼不被建立,要麼一建立就會被銷燬。其它平臺不支援這種操作;你的程式碼不應該依靠一格使用該函式建立的臨時檔案,該檔案在檔案系統中不確定是否有可見的名稱。

    結果物件可以被用作為一個上下文管理器。在完成檔案物件的上下文或銷燬後,臨時檔案將會被從檔案系統中移除。

    mode引數預設為’w+b’,因此被建立的檔案可以在不被關閉的情況下進行讀寫。二進位制模式被使用時,它的行為始終在所有平臺上保持一致,不管資料是如何被儲存的。buffering、encoding和newline的意義與open()中的一致。

    dir、prefix和suffix引數的意義和預設值與mkstemp()中的一致。

    被返回的物件在POSIX平臺上的真實檔案物件。在其他平臺上,它是一個類檔案物件,且它的file屬性為潛在的真實檔案物件。

    os.0_TMPFILE標誌可以被使用,只要他有效且可工作。

tempfile. NamedTemporaryFile(mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True)

    該函式操作與TemporaryFile()的行為精確相似,除了保證檔案在檔案系統中有可見的名稱(在Unix下,目錄整體不連線。)該名稱可以從返回的類檔案物件的name屬性中剝離出來。不論怎樣,該名稱可以被用作二次開啟檔案的手段。被命名的臨時檔案扔被開啟,儘管經由不同的平臺(Unix可用,Windows NT及以後版本不可用)。如果delte為真(預設值),檔案會在其被關閉後被刪除。被返回的物件總是一個file屬性隱含為真檔案物件的類檔案物件。類檔案物件可以被用在一個with陳述中,就像一個正常檔案一樣。

tempfile. SpooledTemporaryFile(max_size=0, mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)

    該函式的造作精確地類似於TemporaryFile()的行為,除了資料被纏繞在記憶體上指導檔案的大小超過max_size,或者指導檔案的fileno()方法被呼叫,在該點上內容將被寫入硬碟並且操作過程類似於TemporaryFile()。

    結果檔案擁有一個額外的方法mrollover(),它造成檔案翻滾到一個硬碟上的檔案,且不顧及它的大小。

    被返回的物件是一個類檔案物件,它的_file屬性不是一個io.BytesIO或io.StringIO物件(取決於二進位制模式或文字模式那個在mode中被明確),就是一個真實的檔案物件。至於到底是那個,取決於rollover()被什麼呼叫。類檔案物件可以被用於with陳述,就和普通檔案一樣。

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

    該函式安全的建立一個臨時檔案,其採用與mkdtemp()相同的規則。結果物件可以被用作上下文管理器。在完成上下文或臨時檔案目錄被銷燬後,新建立的臨時目錄及其所有內容將被從檔案系統中移除。

    目錄名可以倍從被返回的物件的name屬性中剝離。當被返回的物件被用作為上下文管理器,name將會被分配給在with陳述中的as從句的目標,僅在唯一指定的情況下。

    目錄可以被明確的清理,只需通過呼叫cleanup()方法。

tempfile. mkstemp(suffix=None, prefix=None, dir=None, test=False)

    以最安全的方式建立一個臨時檔案。該檔案的建立沒有任何競爭條件,且假設平臺支援實施os.O_EXCL標誌用於os.open()。該檔案只對建立它的使用者ID開放讀寫許可權。如果平臺使用允許位取指示什麼檔案可以被執行,則該檔案可以被任何人執行。檔案描述器不可被子程序所繼承。

    不同於TemporaryFile(),mkstemp()的使用者是會為其刪除臨時檔案而負責的。

    如果suffix不是None,檔名將會以該suffix而結尾,否則就不會有後綴。mkstemp()不會在檔名與字尾名之間放著分割點;如果你需要這麼做,請將分割點初始化在suffix中。

    如果prefix不是None,檔名將會以prfix開始;否則,將會使用預設的prefix。預設情況下,gettempprefix()或gettempprefixb()的返回值是適當的。

    如果dir不是None,檔案將被在該目錄中建立;否則,預設的目錄將被使用。預設的目錄從基於平臺的列表中被選擇,但是使用者的應用可以控制目錄位置,通過建立TEMDIR、TEMP或TMP環境變數。因此不正保證生成的檔名擁有良好的特性,以至於當它經由os.popen()通過外部命令時,它不會請求佇列。

    如果suffix、perfix和dir都不是None,他們必須是同一型別。如果他們是位元組,被返回的名稱將會用位元組取代字串。如果你想要使用位元組返回值有其它預設行為,請通過suffix=b。

    如果text被給出,它按時檔案的將以二進位制模式或文字模式被開啟。在相同的平臺上,它的結果無差別。

tempfile. mkdtemp(suffix=None,prefix=None,dir=None)

    建立一個臨時目錄,採用最安全的方式。目錄的建立中沒有任何金正要求。該目錄只可被建立其的使用者ID開放讀寫許可權。

    mkdtemp()的使用者必須為對目錄的刪除操作或內容改寫操作負責。

    prefix、suffix和dir引數與mkstemp()中的含義相同。

    mkdtemp()返回新目錄的絕對地址名。

tempfile. gettempdir()

    返回臨時檔案所使用目錄的目錄名。它定義了dir引數在該模組中所有函式內的預設值。

    Python檢索一個標準目錄列表取找出一個呼叫者可在其中更順利建立檔案的目錄。

該列表為:

1.由環境變數TMPDIR命名的目錄;

2.由環境變數TEMP命名的目錄;

3.由換將變數TMP命名的目錄;

4.一個平臺指定的位置:

    在Windows中,目錄為C:\TEMP、C:\TMP、\TEMP和\TMP。

    在其它所有平臺上,目錄為/tmp、/var/tmp和/usr/tmp。

5.當前工作目錄為保底儲存。

    該搜尋的結果將會被快取,請檢視下方tempdir的描述。

tempfile. gettempdirb()

    與gettempdir()相似,只不過返回值是位元組格式。

tempfile. gettempprefix()

    返回用於建立臨時檔案的檔名字首。該行為不包含檔案元件。

tempfile. gettempprefixb()

    與gettempprefixb()相似,但返回值為位元組格式。

    該模組使用一個全域性變數取儲存經gettempdir()返回的用於臨時檔案的目錄的名稱。它可以被直接建立區重寫選擇進城,但是不鼓勵這種操作。該模組中的所有函式蠶蛹dir引數,這可以用於明確目錄。我們推薦如此使用。

tempfile. tempdir

    當建立一個非None的值,該標量定義了dir引數在該模組中所有函式內的預設值。

    如果tempdir為None,在除了gettempprefix()函式外前述所有函式中,它跟隨gettempdir()中描述的演算法進行初始化。

1.示例

    這裡有一些tempfile模組的典型適用例程:

>>> import tempfile

# create a temporary file and write some data to it

>>> fp = tempfile.TemporaryFile()

>>> fp.write(b'Hello world!')

# read data from file

>>> fp.seek(0)

>>> fp.read()

b'Hello world!'

# close the file, it will be removed

>>> fp.close()

# create a temporary file using a context manager

>>> with tempfile.TemporaryFile() as fp:

...     fp.write(b'Hello world!')

...     fp.seek(0)

...     fp.read()

b'Hello world!'

>>>

# file is now closed and removed

# create a temporary directory using the context manager

>>> with tempfile.TemporaryDirectory() as tmpdirname:

...     print('created temporary directory', tmpdirname)

>>>

# directory and contents have been removed

2.不贊成的函式和變數

    建立臨時檔案的一種歷史方法是首先使用mktemp()函式生成檔名,然後使用此名稱建立檔案。不幸的是,這種方法不安全,因為不同的程序可以在呼叫mktemp()後建立檔案,但是其餘的可能會嘗試使用第一個進城繼續這個操作,這使得同名檔案有被覆蓋的危險。解決方法是聯合兩步,及時建立一個檔案。mkstemp()和先前提到的其餘函式都使用了這種操作。

tempfile. mktemp(suffix=’’, prefix=’tmp’, dir=None)

    返回一個檔案的絕對路徑名,它在呼叫生成時不應存在。prefix、suffix和dir引數與mkstemp()中的相似,除了names為位元組格式,suffix=None和prefix=None不被支援。

警告:使用這些函式可能會給一個程式中引入一些安全漏洞。當你用檔名做任何事情時,其他人可能會攻擊你。mktemp()的用法可以被NamedTemporaryFile()輕易取代,僅需通過引數設定delete=False:

>>> f = NamedTemporaryFile(delete=False)
>>> f.name
'/tmp/tmptjujjt'
>>> f.write(b"Hello World!\n")
13
>>> f.close()
>>> os.unlink(f.name)
>>> os.path.exists(f.name)
False