一、tempfile介紹
該模塊創建臨時文件和目錄。它適用於所有支持的平台。TemporaryFile
,NamedTemporaryFile
,TemporaryDirectory
,和SpooledTemporaryFile
是高級接口,其提供自動清理和可被用作上下文管理器。mkstemp()
並且 mkdtemp()
是需要手動清理的低級功能。
所有用戶可調用的函數和構造函數都采用其他參數,這些參數允許直接控制臨時文件和目錄的位置和名稱。此模塊使用的文件名包括一串隨機字符,允許在共享臨時目錄中安全地創建這些文件。為了保持向后兼容性,參數順序有些奇怪; 為清晰起見,建議使用關鍵字參數。
二、創建臨時文件
1、TemporaryFile
該模塊定義以下用戶可調用項:
-
tempfile.
TemporaryFile
(mode ='w + b',buffering = None,encoding = None,newline = None,suffix = None,prefix = None,dir = None ) -
返回一個類似文件的對象,可以用作臨時存儲區域。使用與之相同的規則安全地創建文件
mkstemp()
。它將在關閉后立即銷毀(包括在對象被垃圾收集時隱式關閉)。在Unix下,文件的目錄條目根本不是創建的,或者在創建文件后立即刪除。其他平台不支持此功能; 您的代碼不應該依賴於使用此函數創建的臨時文件,該文件在文件系統中具有或不具有可見名稱。生成的對象可以用作上下文管理器。完成文件對象的上下文或銷毀后,臨時文件將從文件系統中刪除。
所述模式參數默認為
'w+b'
使得所創建的文件可以被讀取並且沒有被關閉寫入。使用二進制模式,使其在所有平台上的行為一致,而不考慮存儲的數據。 緩沖,編碼和換行符被解釋為open()
。該目錄,prefix和suffix的參數具有相同的含義和缺省值與
mkstemp()
。返回的對象是POSIX平台上的真實文件對象。在其他平台上,它是一個類文件對象,其
file
屬性是底層的真實文件對象。os.O_TMPFILE
如果該標志可用且有效,則使用該標志(特定於Linux,需要Linux內核3.11或更高版本)。版本3.5中已更改:
os.O_TMPFILE
現在使用該標志(如果可用)。
示例:
from tempfile import TemporaryFile ''' TemporaryFile類的構造方法,其返回的還是一個文件對象。但這個文件對象特殊的地方在於 1. 對應的文件沒有文件名,對除了本程序之外的程序不可見 2. 在被關閉的同時被刪除 ''' temp = TemporaryFile(dir=r'D:\test') # 創建一個臨時文件對象(類似文件句柄) temp.write(b'hello world') # 向臨時文件中寫入內容(bytes類型) # 讀取臨時文件的內容 temp.seek(0) # 從頭讀取,和一般文件對象不同,seek方法的執行不能少 print(temp.read()) temp.close() # 關閉文件的同時刪除文件
2、NamedTemporaryFile
-
tempfile.
NamedTemporaryFile
(mode ='w + b',buffering = None,encoding = None,newline = None,suffix = None,prefix = None,dir = None,delete = True ) -
NamedTemporaryFile 的運行方式與 TemporaryFile 完全相同。不同之處在於,NamedTemporaryFile 初始化時加上了delete參數,默認值為True。當此參數為True時和TemporaryFile類完全一致。如果是False,那么臨時文件對象在被關閉時不會刪除。因此可以在下面的代碼中通過同樣的對象再次打開。可以從
name
返回的類文件對象的屬性中檢索該名稱。
3、SpooledTemporaryFile
-
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()
。生成的文件有一個額外的方法,
rollover()
使文件無論其大小如何都會轉到磁盤文件。返回的對象是一個類文件對象,其
_file
屬性是一個io.BytesIO
或io.StringIO
對象(取決於是否指定了二進制或文本模式)或真正的文件對象,具體取決於是否rollover()
已被調用。類似文件的對象可以在with
語句中使用,就像普通文件一樣。在3.3版中更改: truncate方法現在接受一個
size
參數。
4、mktemp
python早期創建臨時文件的方法是:
1.首先使用mktemp()
函數生成文件名(包涵文件路徑)
2.然后使用此名稱創建文件。
3.示例
import tempfile tmp_path = tempfile.mktemp(dir=r"D:\test") # 指定生成的文件目錄:D:\test目錄下 print(tmp_path) # D:\test\tmpq44i5ytv ---- tmpq44i5ytv是隨機生成的文件名 with open(tmp_path, 'w+') as f: # mktemp只生成路徑,並沒有生成文件,需手動調用open創建 f.write('Hello world') # f.flush()
5、mkstemp
-
tempfile.
mkstemp
(suffix = None,prefix = None,dir = None,text = False ) -
mkstemp方法用於創建一個臨時文件。該方法僅僅用於創建臨時文件,調用tempfile.mkstemp函數后,返回包含兩個元素的元組,第一個元素指示操作該臨時文件的安全級別,第二個元素指示該臨時文件的路徑。參數suffix和prefix分別表示臨時文件名稱的suffix和prefix;dir指定了臨時文件所在的目錄,如果沒有指定目錄,將根據系統環境變量TMPDIR, TEMP或者TMP的設置來保存臨時文件;參數text指定了是否以文本的形式來操作文件,默認為False,表示以二進制的形式來操作文件。
import tempfile tmp_f = tempfile.mkstemp(dir=r"D:\test") print(tmp_f) # (3, 'D:\\test\\tmp98sbordm')-->3:安全級別,D:\\test\\tmp98sbordm:文件所在目錄 fd = tmp_f[1] with open(fd, 'w+') as f: # mkstemp生成了文件,但是文件內容為空,需手動open寫入數據 f.write('Hello world')
三、創建臨時目錄
1、TemporaryDirectory
tempfile.
TemporaryDirectory
(suffix=None,prefix=None,dir =None)
此功能使用與之相同的規則安全地創建臨時目錄mkdtemp()
。生成的對象可以用作上下文管理器。完成上下文或銷毀臨時目錄對象后,將從文件系統中刪除新創建的臨時目錄及其所有內容。
可以從name
返回的對象的屬性中檢索目錄名稱。當返回的對象用作上下文管理器時, name
將as
在with
語句中將該子句的目標分配給該子句的目標(如果有)。
可以通過調用該cleanup()
方法顯式清除該目錄 。
版本3.2中的新功能。
2、mkdtemp
-
tempfile.
mkdtemp
(suffix=None,prefix=None,dir =None) -
盡可能以最安全的方式創建臨時目錄。目錄的創建中沒有競爭條件。該目錄只能通過創建用戶ID進行讀取,寫入和搜索。
用戶
mkdtemp()
負責在完成后刪除臨時目錄及其內容。該prefix,suffix和DIR參數是一樣的
mkstemp()
。mkdtemp()
返回新目錄的絕對路徑名。在版本3.5中更改:suffix,prefix和目錄現在可以以字節為單位提供,以獲取字節返回值。在此之前,只允許str。 suffix和prefix現在接受並默認為
None
使用適當的默認值。
3、gettempdir
-
tempfile.
gettempdir
() -
用於返回保存臨時文件的文件夾路徑。這定義了此模塊中所有函數的dir參數的默認值。
Python搜索標准目錄列表以找到調用用戶可以創建文件的目錄。列表是:
-
由...命名的目錄
TMPDIR
環境變量。 -
由...命名的目錄
TEMP
環境變量。 -
由...命名的目錄
TMP
環境變量。 -
特定於平台的位置:
-
在Windows中,目錄
C:\TEMP
,C:\TMP
,\TEMP
,並\TMP
按此順序。 -
在所有其他平台,目錄
/tmp
,/var/tmp
以及/usr/tmp
在這個順序。
-
-
作為最后的手段,當前的工作目錄。
緩存此搜索的結果,請參閱
tempdir
下面的說明 。 -
4、gettempdirb
-
tempfile.
gettempdirb
() -
與
gettempdir()
但相同,返回值以字節為單位。版本3.5中的新功能。
5、gettempprefix
-
tempfile.
gettempprefix
() -
返回用於創建臨時文件的文件名prefix。這不包含目錄組件。
6、gettempprefixb
-
tempfile.
gettempprefixb
() -
與
gettempprefix()
但相同,返回值以字節為單位。版本3.5中的新功能。
該模塊使用全局變量來存儲用於返回的臨時文件的目錄名稱gettempdir()
。它可以直接設置以覆蓋選擇過程,但不鼓勵這樣做。此模塊中的所有函數都使用dir參數,該參數可用於指定目錄,這是推薦的方法。
7、tempdir
-
tempfile.
tempdir
-
當設置為其他值時
None
,此變量定義此模塊中定義的函數的dir參數的默認值。如果
tempdir
是None
(默認值)任何上述函數的調用,除非gettempprefix()
它按照中描述的算法初始化gettempdir()
。
四、示例
以下是tempfile
模塊典型用法的一些示例:
import tempfile # 1.創建一個臨時文件並向其中寫入一些數據 fp = tempfile.TemporaryFile() fp.write(b'Hello world!') # 2.從文件中讀取數據 fp.seek(0) fp.read() # b'Hello world!' # 3.關閉文件,它將被刪除 fp.close() # 4.使用上下文管理器創建臨時文件 with tempfile.TemporaryFile() as fp: fp.write(b'Hello world!') fp.seek(0) fp.read() # b'Hello world!' # 文件現在已關閉並刪除 # 6.使用上下文管理器創建臨時目錄 with tempfile.TemporaryDirectory() as tmpdirname: print('created temporary directory', tmpdirname) # 目錄和內容已被刪除