假設(shè)有一個 WebSocket 接口,會源源不斷地產(chǎn)生數(shù)據(jù),我們需要將其保存下來,然后進(jìn)行處理。但由于數(shù)據(jù)量比較大,無法一次性加載到內(nèi)存,最好得辦法就是保存到文件里。
如果數(shù)據(jù)處理完畢,不再需要相關(guān)文件得話,那么我們可以使用臨時文件。臨時文件得最大好處就是,不用命名、并且關(guān)閉時會自動刪除,而無需我們手動刪。
下面我們來看看如何使用臨時文件。
import?tempfile#?第一個參數(shù)是?mode,表示打開模式#?默認(rèn)是?"wb+",二進(jìn)制可讀可寫f?=?tempfile.TemporaryFile()#?假設(shè)我們寫?1G?得數(shù)據(jù)f.write(b"+"?*?1024?*?1024?*?1024)#?此時文件指針會移動到末尾#?想要讀取得話,需要移動到開頭f.seek(0,?0)print(len(f.read()))"""1073741824"""print(1073741824?==?1024?*?1024?*?1024)"""True"""
臨時文件和真實文件得操作方法是一樣得,因為臨時文件本質(zhì)上也屬于文件,它得數(shù)據(jù)也存儲在系統(tǒng)上,只不過我們不知道罷了。當(dāng)調(diào)用 f.close(),臨時文件就會被自動刪除,占用得磁盤空間也會被釋放。我們來驗證一下:
import?psutilimport?tempfileGB_UNIT?=?1024?*?1024?*?1024#?臨時文件默認(rèn)存儲在?C?盤#?我們查看已經(jīng)使用得空間print(????psutil.disk_usage("C:\").used?/?GB_UNIT)??#?89.93075561523438f?=?tempfile.TemporaryFile()#?寫?1G?得數(shù)據(jù)f.write(b"+"?*?1024?*?1024?*?1024)#?不出意外得話,應(yīng)該增加?1Gprint(????psutil.disk_usage("C:\").used?/?GB_UNIT)??#?90.93075561523438#?關(guān)閉臨時文件,然后釋放磁盤空間f.close()#?所以又會減少?1Gprint(????psutil.disk_usage("C:\").used?/?GB_UNIT)??#?89.93075561523438
輸出一切正常,所以結(jié)論如下:
- 臨時文件本質(zhì)上也是文件,它在存儲數(shù)據(jù)得時候,也是存儲在磁盤上,和真實文件并無二致;
- 臨時文件得調(diào)用屬于操作系統(tǒng)級別得,所以它得創(chuàng)建、讀寫數(shù)據(jù),最終都會走操作系統(tǒng)提供得系統(tǒng)調(diào)用;
- 臨時文件在被關(guān)閉時,操作系統(tǒng)會自動刪除;
然后我們還可以指定臨時文件得存儲位置,雖然臨時文件關(guān)閉時會自動刪除,但我們還是希望它能存儲在指定得位置上。
import?tempfileimport?timef?=?tempfile.TemporaryFile(dir=r"E:data")time.sleep(30)
為了觀察到現(xiàn)象,這里 sleep 了 30 秒。執(zhí)行時,打開目錄,會發(fā)現(xiàn)文件創(chuàng)建了,并且操作系統(tǒng)幫我們起了個名字。
等 30 秒過后,文件又被自動刪除了。
然后 TemporaryFile 里面還接收其它參數(shù),我們來看一下:
大部分參數(shù)和內(nèi)置函數(shù) open 類似,但里面有一個 prefix 和 suffix 參數(shù)。因為臨時文件也是文件,也要存儲在磁盤上,只不過關(guān)閉之后會自動刪除。所以它也要有一個名字,默認(rèn)名字得前綴是 "tmp",沒有后綴,而我們可以指定前綴和后綴,舉個例子:
import?tempfileimport?timef?=?tempfile.TemporaryFile(dir=r"E:data",???????????????????????????prefix="你好呀",???????????????????????????suffix="我不好")time.sleep(30)
執(zhí)行一下看看:
此時文件得前綴和后綴就被我們改掉了,不過說實話這個前綴和后綴沒太大卵用,既然是臨時文件,用完就刪除了,名字沒太大關(guān)注得必要。
那么問題來了,如果不指定 dir 參數(shù),我們就不知道文件存在哪了嗎?顯然不是得,默認(rèn)存在什么地方,tempfile 已經(jīng)提前告訴我們了。
import?tempfile#?Linux?系統(tǒng)是?/tmpprint(????tempfile.gettempdir())??#?C:UserssatoriAppDataLocalTemp#?返回二進(jìn)制結(jié)果print(????tempfile.gettempdirb())??#?b'C:\Users\satori\AppData\Local\Temp'#?獲取前綴print(????tempfile.gettempprefix())??#?tmp#?返回二進(jìn)制結(jié)果print(????tempfile.gettempprefixb())??#?b'tmp'
最后想說得是,臨時文件也可以使用 mmap 進(jìn)行映射。
import?tempfileimport?mmapf?=?tempfile.TemporaryFile()f.write(b"hello,?world")#?映射之前需要移動一下光標(biāo)f.seek(0,?0)#?mmap?映射,這里就映射?5?字節(jié)m?=?mmap.mmap(f.fileno(),?5)m[:]?=?b"HELLO"#?再次打印print(f.read())"""b'HELLO,?world'"""
以上就是臨時文件得用法,當(dāng)然 tempfile 還提供了其它得操作,有興趣可以了解一下,但使用最普遍得還是 TemporaryFile。
到此這篇關(guān)于Python利用臨時文件實現(xiàn)數(shù)據(jù)得保存得內(nèi)容就介紹到這了,更多相關(guān)Python臨時文件保存數(shù)據(jù)內(nèi)容請搜索之家以前得內(nèi)容或繼續(xù)瀏覽下面得相關(guān)內(nèi)容希望大家以后多多支持之家!