tempfile庫Python臨時文件系統對象

      網友投稿 1050 2022-05-29

      目錄

      前言

      創建臨時文件(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

      tempfile庫:Python臨時文件系統對象

      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小時內刪除侵權內容。

      上一篇:TLK7-EVM開發板規格書
      下一篇:操作系統之進程調度——優先權法和輪轉法(附上樣例講解)
      相關文章
      国产亚洲情侣一区二区无码AV| 国内成人精品亚洲日本语音 | 亚洲av手机在线观看| 国产成人亚洲综合网站不卡| 亚洲区视频在线观看| 亚洲乱码一二三四区麻豆| 亚洲日本香蕉视频| 亚洲成aⅴ人片在线影院八| 亚洲免费观看网站| 亚洲一区二区三区免费视频| 亚洲av午夜精品无码专区| 亚洲 日韩经典 中文字幕| 亚洲日本VA中文字幕久久道具| 亚洲色偷偷偷综合网| 亚洲AV成人精品一区二区三区| 国产成人亚洲综合在线| 亚洲高清成人一区二区三区| 4338×亚洲全国最大色成网站| 国产亚洲?V无码?V男人的天堂| 亚洲中文字幕日产乱码高清app| 亚洲国产成人片在线观看| 亚洲福利在线观看| 亚洲综合激情六月婷婷在线观看| 亚洲毛片一级带毛片基地| wwwxxx亚洲| 亚洲hairy多毛pics大全| avtt亚洲天堂| 自拍偷自拍亚洲精品情侣| 在线播放亚洲第一字幕| 亚洲AV无码专区国产乱码4SE| 亚洲电影国产一区| 亚洲成a人片7777| 亚洲欧美国产精品专区久久| 天堂亚洲免费视频| 久久精品夜色噜噜亚洲A∨| 亚洲va中文字幕无码久久| 亚洲激情校园春色| 亚洲精品V天堂中文字幕| 日本系列1页亚洲系列| 国产AⅤ无码专区亚洲AV| 亚洲国产女人aaa毛片在线 |