Python利用臨時文件實現(xiàn)數(shù)據(jù)得保存

假設(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)容希望大家以后多多支持之家!

聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
發(fā)表評論
更多 網(wǎng)友評論1 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 亚洲乱码精品久久久久..| 国产在线高清精品二区| 亚洲精品亚洲人成人网| aⅴ免费在线观看| 用电动玩具玩自己小视频| 妈妈的朋友在8完整有限中字5| 午夜亚洲乱码伦小说区69堂| 中国一级特黄高清免费的大片中国一级黄色片 | 欧美在线色视频| 最近中文字幕无| 国产成人3p视频免费观看| 久久精品国产一区二区三区肥胖| 91视频综合网| 日本精品久久久久中文字幕| 国产乱弄免费视频| 丰满少妇人妻无码| 美团外卖猛男男同38分钟| 少妇高潮无套内谢麻豆传| 免费在线看v片| 99久久精品美女高潮喷水| 欧美日韩精品一区二区在线播放| 国产精品视频一区二区噜噜| 亚洲国产精品一区二区久久| 亚洲欧美18v中文字幕高清| 日韩精品无码专区免费播放| 国产卡一卡二卡3卡4卡无卡视频 | 欧美交性a视频免费| 国产欧美日韩另类精彩视频| 久久夜色精品国产欧美乱| 色老成人精品视频在线观看| 性生交大片免看| 亚洲综合久久久久久中文字幕| 884aa四虎四虎永久播放地址| 欧美一级做一级爱a做片性| 国产天堂亚洲精品| 中文字幕丝袜制服| 男人把女人狂躁的免费视频| 国产精品色拉拉免费看| 久久精品国产亚洲欧美| 美女视频一区二区| 在线播放无码高潮的视频|