tempfile庫:Python臨時文件系統對象
目錄
前言
創建臨時文件(TemporaryFile)
命名文件
臨時目錄(TemporaryDirectory)
假脫機文件
預測名(NamedTemporaryFile)
gettempdir()與gettempprefix()
前言
在實際的項目處理中,往往我們并不需要創建文件,僅僅用于中轉而已。這個時候在系統中頻繁的創建中轉文件,刪除中轉文件,不僅浪費系統的資源,而且容易被破壞或者篡改,這個時候用臨時文件反而更好。
而Python給我們提供了臨時文件操作庫:tempfile。本篇將詳細介紹臨時文件的應用與處理。
創建臨時文件(TemporaryFile)
一般來說,我們通過tempfile.TemporaryFile()函數創建臨時文件,具體的代碼如下所示:
import tempfile with tempfile.TemporaryFile(mode='w+t') as temp: temp.write("My name is Li Yuanjing") temp.seek(0) print(temp.read()) print(temp.name)
1
2
3
4
5
6
7
運行之后,效果如下:
其中,mode表示以什么方式創建并打開臨時文件,這里w+表示可以讀寫文件,t是以文本模式打開文件。默認寫完內容后,文件句柄在末尾,要重新讀取文件,需要使用seek回轉重定位。
命名文件
當然,我們創建臨時文件是需要使用的,也就是在程序中,我們需要給它一個名字,方便我們進行操作。我們將上面代碼變更一下:
import tempfile import pathlib with tempfile.TemporaryFile(mode='w+t') as temp: temp.write("My name is Li Yuanjing") temp.seek(0) print(temp.read()) f = pathlib.Path(temp.name) print(f.name) f.exists()
1
2
3
4
5
6
7
8
9
10
這里,我們用f變量標記了文件,后面操作的時候,可以使用f進行操作。當我們調用f.exists()函數時,默認臨時文件會被刪除。
臨時目錄(TemporaryDirectory)
在實際的項目中,我們可能并不僅僅只是創建一個臨時文件,有時候也會創建一批量的臨時文件,比如上傳文件時。這個時候,我們就需要創建一個臨時目錄,在臨時目錄中創建文件進行操作。操作完成之后,只要關閉臨時目錄,就可以批量的關閉臨時文件,比單個臨時文件要方便許多。
下面,我們就來創建臨時的目錄,代碼如下:
import tempfile import pathlib with tempfile.TemporaryDirectory() as temp: f = pathlib.Path(temp) print(f) a_file = f / 'a.txt' a_file.write_text("111111111111") b_file = f / 'b.txt' b_file.write_text("222222222222") c_file = f / 'c.txt' c_file.write_text("333333333333") print(a_file.read_text()) print(b_file.read_text()) print(c_file.read_text()) f.exists()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
運行之后,效果如下:
假脫機文件
如果我們處理的臨時文件的數據較少,其實使用SpooledTemporaryFile可能更高效,因為它使用一個io.BytesIO或io.StringIO緩沖區在內存中保存內容,直到數據超過一定的大小,才寫入磁盤,然后用TemporaryFile替代緩沖區。
具體使用方式如下:
import tempfile with tempfile.SpooledTemporaryFile(max_size=1000, mode='w+t', encoding='utf-8') as temp: print(temp) temp.write('15648497987987987') temp.seek(0) print(temp.read())
1
2
3
4
5
6
7
運行之后,效果如下:
這里的max_size就是決定文件小于這個值寫入緩沖區,大于這個值寫入TemporaryFile臨時文件。
當然,我們可以強制將緩沖區寫入臨時文件,可以調用rollover()或fileno()函數。具體代碼如下所示:
import tempfile with tempfile.SpooledTemporaryFile(max_size=1000, mode='w+t', encoding='utf-8') as temp: print(temp) temp.write('15648497987987987') temp.seek(0) temp.rollover() print(temp.read())
1
2
3
4
5
6
7
8
如上面代碼所示,加一句temp.rollover()就行。
預測名(NamedTemporaryFile)
從上面的代碼,我們可以看到,臨時文件單獨創建的方式,文件名是隨機生成的,并不是由程序員指定的,但有時候還需要在名字中包含一些可預測的部分,以便查找和檢查文件來進行調用。
這個時候,指定文件名往往更好。我們指定文件名規律用NamedTemporaryFile()函數,代碼如下:
import tempfile import pathlib tmp_file = tempfile.NamedTemporaryFile(prefix='image_', suffix='_png') print(tmp_file.name)
1
2
3
4
5
運行之后,效果如下:
可以看出來,我們的文件名等于:prefix+random+suffix。當然,其實該函數還有一個dir參數,可以指定目錄。完整的文件名等于:dir+prefix+random+suffix。
gettempdir()與gettempprefix()
在創建臨時文件的時候,如果我們沒有指定dir,那么該臨時文件的路徑會跟隨平臺和設置變化,也就是不確定的位置。這個時候,我們可能需要獲取文件的路徑以及其他參數,通過gettempdir()與gettempprefix()可以做到,具體代碼如下:
import tempfile print(tempfile.gettempdir()) print(tempfile.gettempdirb()) print(tempfile.gettempprefix()) print(tempfile.gettempprefixb())
1
2
3
4
5
6
運行之后,效果如下:
gettempdir:返回包含所有臨時文件的默認目錄
gettempprefix:返回新文件和目錄名的字符串前綴。
而這個2個方法還有一個后綴b的方法,用于返回bytes類型的字符串對象。當然如果你想自己設置臨時目錄,并不跟隨系統,可以直接使用tempfile.tempdir進行設置。
import tempfile tempfile.tempdir=r'd:\temp' print(tempfile.gettempdir())
1
2
3
4
運行之后,效果如下:
Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。