python tempfile 創建臨時目錄


一、tempfile介紹

該模塊創建臨時文件和目錄。它適用於所有支持的平台。TemporaryFileNamedTemporaryFileTemporaryDirectory,和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.BytesIOio.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返回的對象的屬性中檢索目錄名稱。當返回的對象用作上下文管理器時, nameaswith語句中將該子句的目標分配給該子句的目標(如果有)。

可以通過調用該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搜索標准目錄列表以找到調用用戶可以創建文件的目錄。列表是:

  1. 由...命名的目錄 TMPDIR 環境變量。

  2. 由...命名的目錄 TEMP 環境變量。

  3. 由...命名的目錄 TMP 環境變量。

  4. 特定於平台的位置:

    • 在Windows中,目錄C:\TEMPC:\TMP, \TEMP,並\TMP按此順序。

    • 在所有其他平台,目錄/tmp/var/tmp以及 /usr/tmp在這個順序。

  5. 作為最后的手段,當前的工作目錄。

緩存此搜索的結果,請參閱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參數的默認值。

如果tempdirNone(默認值)任何上述函數的調用,除非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)
# 目錄和內容已被刪除

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM