Python每日一練0032

問題

你須要在程序執行時建立一個臨時文件或目錄,並但願使用完以後能夠自動銷燬掉。html

解決方案

tempfile模塊中有不少的函數能夠完成這任務。 爲了建立一個匿名的臨時文件,可使用 tempfile.TemporaryFilepython

from tempfile import TemporaryFile

with TemporaryFile('w+t') as f:
    # Read/write to the file
    f.write('Hello World\n')
    f.write('Testing\n')

    # Seek back to beginning and read the data
    f.seek(0)
    data = f.read()

# Temporary file is destroyed

或者,若是你喜歡,你還能夠像這樣使用臨時文件:安全

f = TemporaryFile('w+t')
# Use the temporary file
...
f.close()
# File is destroyed

TemporaryFile() 的第一個參數是文件模式,一般來說文本模式使用 w+t ,二進制模式使用 w+b 。 這個模式同時支持讀和寫操做,在這裏是頗有用的,由於當你關閉文件去改變模式的時候,文件實際上已經不存在了。 TemporaryFile() 另外還支持跟內置的 open() 函數同樣的參數。好比:微信

with TemporaryFile('w+t', encoding='utf-8', errors='ignore') as f:
    ...

在大多數Unix系統上,經過 TemporaryFile() 建立的文件都是匿名的,甚至連目錄都沒有。 若是你想打破這個限制,可使用 NamedTemporaryFile() 來代替。好比:函數

from tempfile import NamedTemporaryFile

with NamedTemporaryFile('w+t') as f:
    print('filename is:', f.name)
    ...

# File automatically destroyed

這裏,被打開文件的 f.name 屬性包含了該臨時文件的文件名。 當你須要將文件名傳遞給其餘代碼來打開這個文件的時候,這個就頗有用了。 和 TemporaryFile() 同樣,結果文件關閉時會被自動刪除掉。 若是你不想這麼作,能夠傳遞一個關鍵字參數 delete=False 便可。好比:spa

with NamedTemporaryFile('w+t', delete=False) as f:
    print('filename is:', f.name)
    ...

爲了建立一個臨時目錄,可使用 tempfile.TemporaryDirectory() 。好比:code

from tempfile import TemporaryDirectory

with TemporaryDirectory() as dirname:
    print('dirname is:', dirname)
    # Use the directory
    ...
# Directory and all contents destroyed

討論

TemporaryFile()NamedTemporaryFile()TemporaryDirectory() 函數 應該是處理臨時文件目錄的最簡單的方式了,由於它們會自動處理全部的建立和清理步驟。 在一個更低的級別,你可使用 mkstemp()mkdtemp() 來建立臨時文件和目錄。好比:htm

>>> import tempfile
>>> tempfile.mkstemp()
(3, '/var/folders/7W/7WZl5sfZEF0pljrEB1UMWE+++TI/-Tmp-/tmp7fefhv')
>>> tempfile.mkdtemp()
'/var/folders/7W/7WZl5sfZEF0pljrEB1UMWE+++TI/-Tmp-/tmp5wvcv6'
>>>

可是,這些函數並不會作進一步的管理了。 例如,函數 mkstemp() 僅僅就返回一個原始的OS文件描述符,你須要本身將它轉換爲一個真正的文件對象。 一樣你還須要本身清理這些文件。對象

一般來說,臨時文件在系統默認的位置被建立,好比 /var/tmp 或相似的地方。 爲了獲取真實的位置,可使用 tempfile.gettempdir() 函數。好比:utf-8

>>> tempfile.gettempdir()
'/var/folders/7W/7WZl5sfZEF0pljrEB1UMWE+++TI/-Tmp-'
>>>

全部和臨時文件相關的函數都容許你經過使用關鍵字參數 prefixsuffixdir 來自定義目錄以及命名規則。好比:

>>> f = NamedTemporaryFile(prefix='mytemp', suffix='.txt', dir='/tmp')
>>> f.name
'/tmp/mytemp8ee899.txt'
>>>

最後還有一點,儘量以最安全的方式使用 tempfile 模塊來建立臨時文件。 包括僅給當前用戶受權訪問以及在文件建立過程當中採起措施避免競態條件。 要注意的是不一樣的平臺可能會不同。所以你最好閱讀 官方文檔 來了解更多的細節。

來源

Python Cookbook

關注

歡迎關注個人微信公衆號:python每日一練

相關文章
相關標籤/搜索