記事のディレクトリ
このモジュールは、一時ファイルとディレクトリを作成するために使用され、プラットフォーム間で使用できます。TemporaryFile、NamedTemporaryFile、TemporaryDirectory、およびSpooledTemporaryFileは、コンテキストマネージャーとして使用できる自動クリーンアップ関数を備えた高レベルのインターフェイスです。mkstemp()およびmkdtemp()は低レベルの関数であり、使用後に手動でクリーンアップする必要があります。
1tempfileの概要
tempfileモジュールで一般的に使用される関数を次の表に示します。
tempfileモジュールの機能 | 機能の説明 |
---|---|
tempfile.TemporaryFile(mode = 'w + b'、buffering = None、encoding = None、newline = None、suffix = None、prefix = None、dir = None) | 一時ファイルを作成します。この関数は、ファイルI / Oをサポートするファイルのようなオブジェクトを返します。 |
tempfile.NamedTemporaryFile(mode = 'w + b'、buffering = None、encoding = None、newline = None、suffix = None、prefix = None、dir = None、delete = True) | 一時ファイルを作成します。この関数の機能は、生成される一時ファイルのファイルシステム内のファイル名が異なることを除いて、前の関数の機能とほぼ同じです。 |
tempfile.SpooledTemporaryFile(max_size = 0、mode = 'w + b'、buffering = None、encoding = None、newline = None、suffix = None、prefix = None、dir = None) | 一時ファイルを作成します。TemporaryFile関数と比較して、プログラムが一時ファイルにデータを出力する場合、最初にメモリに出力され、max_sizeを超えるまで物理ディスクに出力されます。 |
tempfile.TemporaryDirectory(suffix = None、prefix = None、dir = None) | 一時ディレクトリを生成します。 |
tempfile.gettempdir() | システムの一時ディレクトリを取得します。 |
tempfile.gettempdirb() | 関数がバイト文字列を返すことを除いて、gettempdir()と同じです。 |
tempfile.gettempprefix() | 一時ファイルの生成に使用されるプレフィックス名を返します。 |
tempfile.gettempprefixb() | 関数がバイト文字列を返すことを除いて、gettempprefix()と同じです。 |
ヒント:テーブル内の一部の関数には多くのパラメーターが含まれていますが、これらのパラメーターには独自のデフォルト値があるため、特別な要件がない場合は、パラメーターなしで渡すことができます。
2一時ファイルを作成します
2.1 TemporaryFile
この関数は、一時データストレージ用のファイルのようなオブジェクトを返します(実際にはディスク上の一時ファイルに対応します)。
def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
newline=None, suffix=None, prefix=None,
dir=None, *, errors=None)
生成されたオブジェクトは、コンテキストマネージャーとして使用できます。ファイルオブジェクトのコンテキストまたは破棄が完了すると(ファイルオブジェクトが閉じられるか削除される)、一時ファイルはファイルシステムから削除されます。
- modeパラメーターのデフォルト値は
w+b
バイナリモードであり、読み取りと書き込みが可能です。 - バッファリングは、バッファリング戦略を設定するために使用されます。0:バッファリングを無効にします(バイナリモードでのみ許可されます)、1:行バッファリング(テキストモードでのみ使用可能)、整数> 1:ブロックバッファのサイズを指定します(バイト単位)。バッファリングパラメータが指定されていない場合、デフォルトのバッファリング戦略が使用されます
- encodingは、ファイルのデコードまたはエンコードに使用されるエンコーディングの名前です。
- prefixは、一時ファイル名のプレフィックスを指定します
- 接尾辞は、一時ファイル名の接尾辞を指定します
- dirは、一時ファイルのデフォルトの保存パスを設定するために使用されます
- 返されるファイルのようなオブジェクトには、実際の操作の基になるファイルオブジェクトを指すファイル属性があります。
from tempfile import TemporaryFile
temp = TemporaryFile(dir='/home/skx/pra')
print(temp)
print(temp.name)
'''
TemporaryFile类的构造方法,其返回的还是一个文件对象。但这个文件对象特殊的地方在于
1. 对应的文件没有文件名,对除了本程序之外的程序不可见
2. 在被关闭的同时被删除
所以上面的两句打印语句,输出分别是一个文件对象,以及一个<fdopen>(并不是文件名)
'''
# 向临时文件中写入内容
temp.write(b'hello\nworld')
temp.seek(0) # 将文件指针移动到头部,准备读取文件
print(temp.read())
temp.close() # 关闭文件的同时删除文件
# 通过with语句创建临时文件,with会自动关闭临时文件
with TemporaryFile() as fd:
fd.write("我最棒".encode('utf-8'))
fd.seek(0)
print(fd.read().decode('utf-8'))
<_io.BufferedRandom name=3>
3
b'hello\nworld'
我最棒
注:modeパラメーターのデフォルト値では、w+b
strを書き込むたびに、バイナリに変換してから再度書き込む必要があります。これは非常に面倒です。openingメソッドをとして指定して、w+
直接読み書きできるようにすることができます。strタイプ。
構成ファイルを読み取り、一時ファイルに入れます
- 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
この関数によって実行される操作はTemporaryFile()とまったく同じですが、作成される一時ファイルにはファイル名があり、ファイルシステムで見つけることができるため、複数のプロセスから同時にアクセスできます。
def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
newline=None, suffix=None, prefix=None,
dir=None, delete=True, *, errors=None)
この関数には追加の削除パラメーターがあり、ファイルのようなオブジェクトを閉じた後、またはdelの後にディスク上の一時ファイルも削除するかどうかを指定します(delete = Trueの場合、動作はTemporaryFileと同じです)。
import os
from tempfile import NamedTemporaryFile
# 指定文件以 "head_" 开头,以"_tail"结尾
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,文件对象 close 或者被 del 之后,磁盘文件不会被删除
print('Exists after close:', os.path.exists(temp.name))
演算結果:
temp: <tempfile._TemporaryFileWrapper object at 0x7f17ac9bf0b8>
temp.name: /home/skx/pra/head_0dsw2361_tail
Exists after close: True
delete = Falseを指定すると、ファイルオブジェクトを閉じるかdelした後、ディスク上の一時ファイルは削除されません。指定したディレクトリ内のファイルは次のように表示されます。
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)
この関数によって実行される操作はTemporaryFile()とまったく同じですが、ファイルサイズがmax_sizeを超えるか、ファイルのfileno()メソッドが呼び出されるまで、データはメモリにキャッシュされます。ディスク。
2.4 mkstemp
tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)
- prefixは、一時ファイル名のプレフィックスを指定します
- 接尾辞は、一時ファイル名の接尾辞を指定します
- dirは、一時ファイルのデフォルトの保存パスを設定するために使用されます
- textは、ファイルをテキスト形式で操作するかどうかを指定します。デフォルトはFalseです。これは、ファイルがバイナリ形式で操作されることを意味します。
mkstemp()はタプルを返し、タプルの最初の要素はハンドルであり、開いているファイル(os.open()の戻り値に相当)を指すシステムレベルのハンドルであり、2番目の要素はファイルです。絶対パス。
ファイルが使用された後、ファイルは自動的にクリアされません。手動でクリアする必要があります。
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())
運転結果
(3, '/home/skx/pra/tmp58do2j53')
Hello world
3一時ディレクトリを作成します
3.1 TemporaryDirectory
tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)
- prefixは、一時ファイル名のプレフィックスを指定します
- 接尾辞は、一時ファイル名の接尾辞を指定します
- dirは、一時ファイルのデフォルトの保存パスを設定するために使用されます
この関数は、一時ディレクトリを安全に作成します。この関数によって返されるオブジェクトは、コンテキストマネージャーとして使用できます。コンテキストを完了するか、一時ディレクトリオブジェクトを破棄すると、新しく作成された一時ディレクトリとそのすべての内容がファイルシステムから自動的に削除されます。
cleanup()メソッドを呼び出して、ディレクトリを手動でクリーンアップすることもできます。
import os
import tempfile
with tempfile.TemporaryDirectory(suffix='_tail', prefix='head_') as dir_name:
print(dir_name)
print(os.path.exists(dir_name))
運転結果
/tmp/head_gtbt2gkw_tail
False
3.2 mkdtemp
def mkdtemp(suffix=None, prefix=None, dir=None)
- prefixは、一時ファイル名のプレフィックスを指定します
- 接尾辞は、一時ファイル名の接尾辞を指定します
- dirは、一時ファイルのデフォルトの保存パスを設定するために使用されます
最も安全な方法で一時ディレクトリを作成します。ディレクトリを作成するときに競合は発生しません。ディレクトリは、作成者のみが読み取り、書き込み、および検索できます。新しいディレクトリの絶対パス名を返します。
ユーザーが一時ディレクトリを使い果たした後、自分で削除する必要があります。
import os
import tempfile
dir_name = tempfile.mkdtemp(suffix='_tail', prefix='head_', dir='/tmp')
print(dir_name)
# 需要手动清理
os.removedirs(dir_name)
運転結果
/tmp/head_kn9uoe1z_tail