tempfile --- 生成臨時(shí)文件和目錄?
源代碼: Lib/tempfile.py
該模塊用于創(chuàng)建臨時(shí)文件和目錄,它可以跨平臺(tái)使用。TemporaryFile、NamedTemporaryFile、TemporaryDirectory 和 SpooledTemporaryFile 是帶有自動(dòng)清理功能的高級(jí)接口,可用作上下文管理器。mkstemp() 和 mkdtemp() 是低級(jí)函數(shù),使用完畢需手動(dòng)清理。
所有由用戶調(diào)用的函數(shù)和構(gòu)造函數(shù)都帶有參數(shù),這些參數(shù)可以設(shè)置臨時(shí)文件和臨時(shí)目錄的路徑和名稱。該模塊生成的文件名包括一串隨機(jī)字符,在公共的臨時(shí)目錄中,這些字符可以讓創(chuàng)建文件更加安全。為了保持向后兼容性,參數(shù)的順序有些奇怪。所以為了代碼清晰,建議使用關(guān)鍵字參數(shù)。
這個(gè)模塊定義了以下內(nèi)容供用戶調(diào)用:
-
tempfile.TemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)? 返回一個(gè) file-like object 作為臨時(shí)存儲(chǔ)區(qū)域。創(chuàng)建該文件使用了與
mkstemp()相同的安全規(guī)則。它將在關(guān)閉后立即銷毀(包括垃圾回收機(jī)制關(guān)閉該對(duì)象時(shí))。在 Unix 下,該文件在目錄中的條目根本不創(chuàng)建,或者創(chuàng)建文件后立即就被刪除了,其他平臺(tái)不支持此功能。您的代碼不應(yīng)依賴使用此功能創(chuàng)建的臨時(shí)文件名稱,因?yàn)樗谖募到y(tǒng)中的名稱可能是可見(jiàn)的,也可能是不可見(jiàn)的。生成的對(duì)象可以用作上下文管理器(參見(jiàn) 例子)。完成文件對(duì)象的上下文或銷毀后,臨時(shí)文件將從文件系統(tǒng)中刪除。
mode 參數(shù)默認(rèn)值為
'w+b'因此創(chuàng)建的文件可以讀取或?qū)懭攵挥藐P(guān)閉。 因?yàn)槭鞘褂枚M(jìn)制模式,所以它在所有平臺(tái)上的行為都保持一致而不用關(guān)心所存儲(chǔ)的是什么數(shù)據(jù)。 buffering, encoding 和 newline 的解讀方式與open()相同。參數(shù) dir、prefix 和 suffix 的含義和默認(rèn)值都與它們?cè)?
mkstemp()中的相同。在 POSIX 平臺(tái)上,它返回的對(duì)象是真實(shí)的文件對(duì)象。在其他平臺(tái)上,它是一個(gè)文件類對(duì)象 (file-like object),它的
file屬性是底層的真實(shí)文件對(duì)象。如果可用,則使用
os.O_TMPFILE標(biāo)志(僅限于 Linux,需要 3.11 及更高版本的內(nèi)核)。在 3.5 版更改: 如果可用,現(xiàn)在用的是
os.O_TMPFILE標(biāo)志。
-
tempfile.NamedTemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True)? 此函數(shù)執(zhí)行的操作與
TemporaryFile()完全相同,但確保了該臨時(shí)文件在文件系統(tǒng)中具有可見(jiàn)的名稱(在 Unix 上表現(xiàn)為目錄條目不取消鏈接)。從返回的文件類對(duì)象的name屬性中可以檢索到文件名。在臨時(shí)文件仍打開時(shí),是否允許用文件名第二次打開文件,在各個(gè)平臺(tái)上是不同的(在 Unix 上可以,但在 Windows NT 或更高版本上不行)。如果 delete 為 true(默認(rèn)值),則文件會(huì)在關(guān)閉后立即被刪除。該函數(shù)返回的對(duì)象始終是文件類對(duì)象 (file-like object),它的file屬性是底層的真實(shí)文件對(duì)象。文件類對(duì)象可以像普通文件一樣在with語(yǔ)句中使用。
-
tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)? 此函數(shù)執(zhí)行的操作與
TemporaryFile()完全相同,但會(huì)將數(shù)據(jù)緩存在內(nèi)存中,直到文件大小超過(guò) max_size,或調(diào)用文件的fileno()方法為止,此時(shí)數(shù)據(jù)會(huì)被寫入磁盤,并且寫入操作與TemporaryFile()相同。此函數(shù)生成的文件對(duì)象有一個(gè)額外的方法——
rollover(),可以忽略文件大小,讓文件立即寫入磁盤。返回的對(duì)象是文件類對(duì)象 (file-like object),它的
_file屬性是io.BytesIO或io.TextIOWrapper對(duì)象(取決于指定的是二進(jìn)制模式還是文本模式)或真實(shí)的文件對(duì)象(取決于是否已調(diào)用rollover())。文件類對(duì)象可以像普通文件一樣在with語(yǔ)句中使用。在 3.3 版更改: 現(xiàn)在,文件的 truncate 方法可接受一個(gè)
size參數(shù)。
-
tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)? 此函數(shù)會(huì)安全地創(chuàng)建一個(gè)臨時(shí)目錄,且使用與
mkdtemp()相同的規(guī)則。此函數(shù)返回的對(duì)象可用作上下文管理器(參見(jiàn) 例子)。完成上下文或銷毀臨時(shí)目錄對(duì)象后,新創(chuàng)建的臨時(shí)目錄及其所有內(nèi)容將從文件系統(tǒng)中刪除。可以從返回對(duì)象的
name屬性中找到臨時(shí)目錄的名稱。當(dāng)返回的對(duì)象用作上下文管理器時(shí),這個(gè)name會(huì)作為with語(yǔ)句中as子句的目標(biāo)(如果有 as 的話)。可以調(diào)用
cleanup()方法來(lái)手動(dòng)清理目錄。3.2 新版功能.
-
tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)? 以最安全的方式創(chuàng)建一個(gè)臨時(shí)文件。假設(shè)所在平臺(tái)正確實(shí)現(xiàn)了
os.open()的os.O_EXCL標(biāo)志,則創(chuàng)建文件時(shí)不會(huì)有競(jìng)爭(zhēng)的情況。該文件只能由創(chuàng)建者讀寫,如果所在平臺(tái)用權(quán)限位來(lái)標(biāo)記文件是否可執(zhí)行,那么沒(méi)有人有執(zhí)行權(quán)。文件描述符不會(huì)過(guò)繼給子進(jìn)程。與
TemporaryFile()不同,mkstemp()用戶用完臨時(shí)文件后需要自行將其刪除。如果 suffix 不是
None則文件名將以該后綴結(jié)尾,是None則沒(méi)有后綴。mkstemp()不會(huì)在文件名和后綴之間加點(diǎn),如果需要加一個(gè)點(diǎn)號(hào),請(qǐng)將其放在 suffix 的開頭。如果 prefix 不是
None,則文件名將以該前綴開頭,是None則使用默認(rèn)前綴。默認(rèn)前綴是gettempprefix()或gettempprefixb()函數(shù)的返回值(自動(dòng)調(diào)用合適的函數(shù))。如果 dir 不為
None,則在指定的目錄創(chuàng)建文件,是None則使用默認(rèn)目錄。默認(rèn)目錄是從一個(gè)列表中選擇出來(lái)的,這個(gè)列表不同平臺(tái)不一樣,但是用戶可以設(shè)置 TMPDIR、TEMP 或 TMP 環(huán)境變量來(lái)設(shè)置目錄的位置。因此,不能保證生成的臨時(shí)文件路徑很規(guī)范,比如,通過(guò)os.popen()將路徑傳遞給外部命令時(shí)仍需要加引號(hào)。如果 suffix、prefix 和 dir 中的任何一個(gè)不是
None,就要保證它們是同一數(shù)據(jù)類型。如果它們是 bytes,則返回的名稱的類型就是 bytes 而不是 str。如果確實(shí)要用默認(rèn)參數(shù),但又想要返回值是 bytes 類型,請(qǐng)傳入suffix=b''。如果指定了 text 參數(shù),它表示的是以二進(jìn)制模式(默認(rèn))還是文本模式打開文件。在某些平臺(tái)上,兩種模式?jīng)]有區(qū)別。
mkstemp()返回一個(gè)元組,元組中第一個(gè)元素是句柄,它是一個(gè)系統(tǒng)級(jí)句柄,指向一個(gè)打開的文件(等同于os.open()的返回值),第二元素是該文件的絕對(duì)路徑。在 3.5 版更改: 現(xiàn)在,suffix、prefix 和 dir 可以以 bytes 類型按順序提供,以獲得 bytes 類型的返回值。之前只允許使用 str。suffix 和 prefix 現(xiàn)在可以接受
None,并且默認(rèn)為None以使用合適的默認(rèn)值。在 3.6 版更改: dir 參數(shù)現(xiàn)在可接受一個(gè)路徑類對(duì)象 (path-like object)。
-
tempfile.mkdtemp(suffix=None, prefix=None, dir=None)? 以最安全的方式創(chuàng)建一個(gè)臨時(shí)目錄,創(chuàng)建該目錄時(shí)不會(huì)有競(jìng)爭(zhēng)的情況。該目錄只能由創(chuàng)建者讀取、寫入和搜索。
mkdtemp()用戶用完臨時(shí)目錄后需要自行將其刪除。prefix、suffix 和 dir 的含義與它們?cè)?
mkstemp()中的相同。mkdtemp()返回新目錄的絕對(duì)路徑名。在 3.5 版更改: 現(xiàn)在,suffix、prefix 和 dir 可以以 bytes 類型按順序提供,以獲得 bytes 類型的返回值。之前只允許使用 str。suffix 和 prefix 現(xiàn)在可以接受
None,并且默認(rèn)為None以使用合適的默認(rèn)值。在 3.6 版更改: dir 參數(shù)現(xiàn)在可接受一個(gè)路徑類對(duì)象 (path-like object)。
-
tempfile.gettempdir()? 返回放置臨時(shí)文件的目錄的名稱。這個(gè)方法的返回值就是本模塊所有函數(shù)的 dir 參數(shù)的默認(rèn)值。
Python 搜索標(biāo)準(zhǔn)目錄列表,以找到調(diào)用者可以在其中創(chuàng)建文件的目錄。這個(gè)列表是:
TMPDIR環(huán)境變量指向的目錄。TEMP環(huán)境變量指向的目錄。TMP環(huán)境變量指向的目錄。與平臺(tái)相關(guān)的位置:
在 Windows 上,依次為
C:\TEMP、C:\TMP、\TEMP和\TMP。在所有其他平臺(tái)上,依次為
/tmp、/var/tmp和/usr/tmp。
不得已時(shí),使用當(dāng)前工作目錄。
搜索的結(jié)果會(huì)緩存起來(lái),參見(jiàn)下面
tempdir的描述。
-
tempfile.gettempdirb()? 與
gettempdir()相同,但返回值為字節(jié)類型。3.5 新版功能.
-
tempfile.gettempprefix()? 返回用于創(chuàng)建臨時(shí)文件的文件名前綴,它不包含目錄部分。
-
tempfile.gettempprefixb()? 與
gettempprefix()相同,但返回值為字節(jié)類型。3.5 新版功能.
本模塊使用一個(gè)全局變量來(lái)存儲(chǔ)由 gettempdir() 返回的臨時(shí)文件目錄路徑。可以直接給它賦值,這樣可以覆蓋自動(dòng)選擇的路徑,但是不建議這樣做。本模塊中的所有函數(shù)都帶有一個(gè) dir 參數(shù),該參數(shù)可用于指定目錄,這是推薦的方法。
-
tempfile.tempdir? 當(dāng)設(shè)置為
None以外的其他值時(shí),此變量將決定本模塊所有函數(shù)的 dir 參數(shù)的默認(rèn)值。如果在調(diào)用除
gettempprefix()外的上述任何函數(shù)時(shí)tempdir為None(默認(rèn)值) 則它會(huì)按照gettempdir()中所描述的算法來(lái)初始化。
例子?
以下是 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
已棄用的函數(shù)和變量?
創(chuàng)建臨時(shí)文件有一種歷史方法,首先使用 mktemp() 函數(shù)生成一個(gè)文件名,然后使用該文件名創(chuàng)建文件。不幸的是,這是不安全的,因?yàn)樵谡{(diào)用 mktemp() 與隨后嘗試創(chuàng)建文件的進(jìn)程之間的時(shí)間里,其他進(jìn)程可能會(huì)使用該名稱創(chuàng)建文件。解決方案是將兩個(gè)步驟結(jié)合起來(lái),立即創(chuàng)建文件。這個(gè)方案目前被 mkstemp() 和上述其他函數(shù)所采用。
-
tempfile.mktemp(suffix='', prefix='tmp', dir=None)? 2.3 版后已移除: 使用
mkstemp()來(lái)代替。返回一個(gè)絕對(duì)路徑,這個(gè)路徑指向的文件在調(diào)用本方法時(shí)不存在。prefix、suffix 和 dir 參數(shù)與
mkstemp()中的同名參數(shù)類似,不同之處在于不支持字節(jié)類型的文件名,不支持suffix=None和prefix=None。警告
使用此功能可能會(huì)在程序中引入安全漏洞。當(dāng)你開始使用本方法返回的文件執(zhí)行任何操作時(shí),可能有人已經(jīng)捷足先登了。
mktemp()的功能可以很輕松地用NamedTemporaryFile()代替,當(dāng)然需要傳遞delete=False參數(shù):>>> 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
