python tempfile cleanup_python tempfile 模块---生成临时文件和目录
1 tempfile介紹
tempfile 模塊中常用的函數(shù),如下表所示。
tempfile 模塊函數(shù)功能描述tempfile.TemporaryFile(mode=‘w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)創(chuàng)建臨時(shí)文件。該函數(shù)返回一個(gè)類文件對(duì)象,也就是支持文件 I/O。
tempfile.NamedTemporaryFile(mode=‘w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True)創(chuàng)建臨時(shí)文件。該函數(shù)的功能與上一個(gè)函數(shù)的功能大致相同,只是它生成的臨時(shí)文件在文件系統(tǒng)中有文件名。
tempfile.SpooledTemporaryFile(max_size=0, mode=‘w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)創(chuàng)建臨時(shí)文件。與 TemporaryFile 函數(shù)相比,當(dāng)程序向該臨時(shí)文件輸出數(shù)據(jù)時(shí),會(huì)先輸出到內(nèi)存中,直到超過 max_size 才會(huì)真正輸出到物理磁盤中。
tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)生成臨時(shí)目錄。
tempfile.gettempdir()獲取系統(tǒng)的臨時(shí)目錄。
tempfile.gettempdirb()與 gettempdir() 相同,只是該函數(shù)返回字節(jié)串。
tempfile.gettempprefix()返回用于生成臨時(shí)文件的前綴名。
tempfile.gettempprefixb()與 gettempprefix() 相同,只是該函數(shù)返回字節(jié)串。
提示:表中有些函數(shù)包含很多參數(shù),但這些參數(shù)都具有自己的默認(rèn)值,因此如果沒有特殊要求,可以不對(duì)其傳參。
2 創(chuàng)建臨時(shí)文件
2.1 TemporaryFile
該函數(shù)返回一個(gè)類文件對(duì)象,用于臨時(shí)數(shù)據(jù)保存(實(shí)際上對(duì)應(yīng)磁盤上的一個(gè)臨時(shí)文件)。
def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
newline=None, suffix=None, prefix=None,
dir=None, *, errors=None)
生成的對(duì)象可以用作上下文管理器。完成文件對(duì)象的上下文或銷毀后(文件對(duì)象被 close 或者被 del),臨時(shí)文件將從文件系統(tǒng)中刪除。
mode 參數(shù)默認(rèn)值為 w+b,采用二進(jìn)制模式,可以進(jìn)行讀寫
buffering 用于設(shè)置緩沖策略。0:關(guān)閉緩沖(僅允許在二進(jìn)制模式下),1:行緩沖(僅在文本模式下可用),>1 的整數(shù):指定塊緩沖區(qū)的大小(以字節(jié)為單位)。如果沒有給出 buffering 參數(shù),采用默認(rèn)緩沖策略
encoding 是用于解碼或編碼文件的編碼的名稱
prefix 指定了臨時(shí)文件名的前綴
suffix 指定了臨時(shí)文件名的后綴
dir 用于設(shè)置臨時(shí)文件默認(rèn)的保存路徑
返回的類文件對(duì)象有一個(gè) file 屬性,它指向真正操作的底層的 file 對(duì)象
from tempfile import TemporaryFile
temp = TemporaryFile(dir='/home/skx/pra')
print(temp)
print(temp.name)
'''
TemporaryFile類的構(gòu)造方法,其返回的還是一個(gè)文件對(duì)象。但這個(gè)文件對(duì)象特殊的地方在于
1. 對(duì)應(yīng)的文件沒有文件名,對(duì)除了本程序之外的程序不可見
2. 在被關(guān)閉的同時(shí)被刪除
所以上面的兩句打印語句,輸出分別是一個(gè)文件對(duì)象,以及一個(gè)(并不是文件名)
'''
# 向臨時(shí)文件中寫入內(nèi)容
temp.write(b'hello\nworld')
temp.seek(0) # 將文件指針移動(dòng)到頭部,準(zhǔn)備讀取文件
print(temp.read())
temp.close() # 關(guān)閉文件的同時(shí)刪除文件
# 通過with語句創(chuàng)建臨時(shí)文件,with會(huì)自動(dòng)關(guān)閉臨時(shí)文件
with TemporaryFile() as fd:
fd.write("我最棒".encode('utf-8'))
fd.seek(0)
print(fd.read().decode('utf-8'))
3
b'hello\nworld'
我最棒
注意:mode 參數(shù)默認(rèn)值為 w+b,寫 str 時(shí)每次需要轉(zhuǎn)換為 binary 再寫入,這樣很麻煩,可以指定打開方式為 w+,這樣就可以直接進(jìn)行 str 類型的讀寫了
讀取配置文件放入臨時(shí)文件
example.ini
[DEFAULT]
ip = 172.0.0.1
port = 22
[bitbucket.org]
user = Atlan
conf_tempfile.py
#coding=utf-8
import configparser
from tempfile import TemporaryFile
conf = configparser.ConfigParser()
conf.read('example.ini')
with TemporaryFile(mode='w+') as fd:
conf.write(fd) # 注意這里的用法
fd.seek(0)
print(fd.read())
2.2 NamedTemporaryFile
此函數(shù)執(zhí)行的操作與 TemporaryFile() 完全相同,但是創(chuàng)建的臨時(shí)文件有文件名,在文件系統(tǒng)中可以找到,因此可以多個(gè)進(jìn)程同時(shí)訪問
def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
newline=None, suffix=None, prefix=None,
dir=None, delete=True, *, errors=None)
該函數(shù)多了一個(gè) delete 參數(shù),用于指定類文件對(duì)象 close 或者被 del 之后,是否也一同刪除磁盤上的臨時(shí)文件(當(dāng) delete = True 的時(shí)候,行為與 TemporaryFile 一樣)。
import os
from tempfile import NamedTemporaryFile
# 指定文件以 "head_" 開頭,以"_tail"結(jié)尾
temp = NamedTemporaryFile(suffix="_tail", prefix="head_", dir='/home/skx/pra',delete=False)
try:
print('temp:', temp)
print('temp.name:', temp.name)
finally:
temp.close()
# 指定了delete,文件對(duì)象 close 或者被 del 之后,磁盤文件不會(huì)被刪除
print('Exists after close:', os.path.exists(temp.name))
運(yùn)行結(jié)果:
temp:
temp.name: /home/skx/pra/head_0dsw2361_tail
Exists after close: True
指定 delete=False,文件對(duì)象 close 或者被 del 之后,不刪除磁盤上的臨時(shí)文件,在指定的目錄中可以看到文件如下
2.3 SpooledTemporaryFile
tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1,
encoding=None, newline=None,
suffix=None, prefix=None, dir=None, *, errors=None)
此函數(shù)執(zhí)行的操作與 TemporaryFile() 完全相同,但會(huì)將數(shù)據(jù)緩存在內(nèi)存中,直到文件大小超過 max_size,或調(diào)用文件的 fileno() 方法為止,此時(shí)數(shù)據(jù)會(huì)被寫入磁盤。
2.4 mkstemp
tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)
prefix 指定了臨時(shí)文件名的前綴
suffix 指定了臨時(shí)文件名的后綴
dir 用于設(shè)置臨時(shí)文件默認(rèn)的保存路徑
text 指定了是否以文本的形式來操作文件,默認(rèn)為False,表示以二進(jìn)制的形式來操作文件。
mkstemp() 返回一個(gè)元組,元組中第一個(gè)元素是句柄,它是一個(gè)系統(tǒng)級(jí)句柄,指向一個(gè)打開的文件(等同于 os.open() 的返回值),第二元素是該文件的絕對(duì)路徑。
文件使用完后文件不會(huì)自動(dòng)清除,需要手動(dòng)清理。
import tempfile
tmp_f = tempfile.mkstemp(dir="/home/skx/pra/")
print(tmp_f)# (3, '/home/skx/pra/tmp58do2j53')--> tmp_f[0] 是句柄,tmp_f[1] 是文件路徑
fd = tmp_f[1]
with open(fd, 'w+') as f:
f.write('Hello world')
f.seek(0)
print(f.read())
運(yùn)行結(jié)果
(3, '/home/skx/pra/tmp58do2j53')
Hello world
3 創(chuàng)建臨時(shí)目錄
3.1 TemporaryDirectory
tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)
prefix 指定了臨時(shí)文件名的前綴
suffix 指定了臨時(shí)文件名的后綴
dir 用于設(shè)置臨時(shí)文件默認(rèn)的保存路徑
此函數(shù)會(huì)安全地創(chuàng)建一個(gè)臨時(shí)目錄。此函數(shù)返回的對(duì)象可用作上下文管理器。完成上下文或銷毀臨時(shí)目錄對(duì)象后,新創(chuàng)建的臨時(shí)目錄及其所有內(nèi)容自動(dòng)將從文件系統(tǒng)中刪除。
也可以調(diào)用 cleanup() 方法手動(dòng)清理目錄。
import os
import tempfile
with tempfile.TemporaryDirectory(suffix='_tail', prefix='head_') as dir_name:
print(dir_name)
print(os.path.exists(dir_name))
運(yùn)行結(jié)果
/tmp/head_gtbt2gkw_tail
False
3.2 mkdtemp
def mkdtemp(suffix=None, prefix=None, dir=None)
prefix 指定了臨時(shí)文件名的前綴
suffix 指定了臨時(shí)文件名的后綴
dir 用于設(shè)置臨時(shí)文件默認(rèn)的保存路徑
以最安全的方式創(chuàng)建一個(gè)臨時(shí)目錄,創(chuàng)建該目錄時(shí)不會(huì)有競(jìng)爭(zhēng)的情況。該目錄只能由創(chuàng)建者讀取、寫入和搜索。返回新目錄的絕對(duì)路徑名。
用戶用完臨時(shí)目錄后需要自行將其刪除。
import os
import tempfile
dir_name = tempfile.mkdtemp(suffix='_tail', prefix='head_', dir='/tmp')
print(dir_name)
# 需要手動(dòng)清理
os.removedirs(dir_name)
運(yùn)行結(jié)果
/tmp/head_kn9uoe1z_tail
原文鏈接:https://blog.csdn.net/happyjacob/article/details/112385665
總結(jié)
以上是生活随笔為你收集整理的python tempfile cleanup_python tempfile 模块---生成临时文件和目录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python-访问者模式
- 下一篇: websocket python爬虫_p