1. 程式人生 > >python 臨時檔案的使用-檔案流或字串(位元組串)直接轉為檔案物件

python 臨時檔案的使用-檔案流或字串(位元組串)直接轉為檔案物件

Python的強大永遠會帶給我們意外的驚喜。最近在使用websocket時遇到了檔案物件的傳輸問題:對於前端頁面傳來的檔案流、字串需要轉為檔案物件再傳輸給api介面。那麼首先想到的是將檔案流或字串存入檔案再從直接讀取以獲取檔案檔案物件,這種方式固然可行,但是弊端是需要額外佔用空間來儲存檔案,當然我們也可以每次呼叫結束後清理檔案,如果沒有臨時檔案模組這也是一種可行的方式。

強大如python,擁有臨時檔案模組-tempfile,這個模組可以產生臨時檔案或資料夾,並且支援所有的平臺。

這個模組我們常用的方法如下:

tempfile.TemporaryFile([mode='w+b'[, bufsize=-1

[, suffix=''[, prefix='tmp'[, dir=None]]]]])

這個方法會返回一個臨時儲存的檔案物件, 這個檔案物件將在使用close方法或垃圾回收後被銷燬。在使用過程中不應該依賴於使用此函式建立的臨時檔案,該檔案在檔案系統中具有或不具有可見名稱。這個方法建立的檔案物件預設模式是“w+b”,bufsize預設為-1,表示使用作業系統預設值。

返回的物件在POSIX平臺上的真實檔案物件,在其他平臺上,它是一個類檔案物件,其file屬性是底層的真實檔案物件。這個類檔案物件可以在with語句中使用,就像普通檔案一樣。

tempfile.NamedTemporaryFile

([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])

這個方法與TemporaryFile()基本相同,區別是它可以保證檔案在檔案系統中具有可見名稱。可以從返回的類檔案物件的name屬性中檢索該名稱。名稱可以用於第二次開啟檔案, 如果delete為true(預設值),則檔案一關閉就會被刪除。

>>> f = NamedTemporaryFile(delete=False) 
>>> f <open file '<fdopen>', mode 'w+b' at 0x384698> 
>>> f.name '/var/folders/5q/5qTPn6xq2RaWqk+1Ytw3-U+++TI/-Tmp-/tmpG7V1Y0' 
>>> f.write("Hello World!\n") 
>>> f.close() # 關閉即刪除檔案 
>>> os.unlink(f.name) 
>>> os.path.exists(f.name) 
False

完整的檔案流或字串、位元組串轉檔案物件的方法:

import tempfile

def string_to_file(string):
    file_like_obj = tempfile.NamedTemporaryFile()
    file_like_obj.write(string)
    # 確保string立即寫入檔案
    file_like_obj.flush()
    # 將檔案讀取指標返回到檔案開頭位置
    file_like_obj.seek(0)
    return file_like_object

對於臨時資料夾的建立使用的是:tempfile.tempdir

>>> import tempfile
>>> tempfile.tempdir
# 返回臨時資料夾路徑
>>> tempfile.gettempdir()   # 對於不同平臺臨時資料夾建立的路徑也不一樣
'c:\\users\\hlshang\\appdata\\local\\temp'

對於更多方法及使用可以參考官方文件。