Categories: Python

【Python】一時ファイルを扱う方法を解説

この記事では、Python で一時ファイル(temporary file)を使う方法を解説します。

Python で一時ファイルを扱うには tempfileモジュール を使うと簡単です。tempfileモジュール は、標準ライブラリなのでインポートするだけで使用可能です。

import tempfile

Linktempfile --- 一時ファイルやディレクトリの作成 — Python ドキュメント

それでは、一時ファイルを使う方法を見ていきましょう。

一時ファイルを生成する

一時ファイルを扱うには tempfile.TemporaryFile()クラス を使います。 戻り値に閉じることですぐに削除されるファイルオブジェクトを返します。

tempfile.TemporaryFile(mode='w+b', buffering=- 1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)

定義されている引数は、ほとんど open()関数 と同じである。

open()関数 と異なる引数として以下のようなものが定義されている。以下の引数を指定する場合、同じ型の値を渡す必要がある。

suffix 指定された場合、ファイル名に接尾辞として追加される。
prefix 指定された場合、ファイル名に接頭辞として追加される。
dir 指定された場合、そのディレクトリ下にファイルが作成される。

試しに、一時ファイルに適当な文字を読み書きしてみる。

import tempfile # 一時ファイルの生成 fp = tempfile.TemporaryFile() # 一時ファイルに書き込み fp.write(b'abc') fp.write(b'def') # ファイルオブジェクトの位置を先頭に移動 fp.seek(0) # 一時ファイルの中身の取得・出力 print(fp.read()) # 一時ファイルを閉じる fp.close()

実行結果

b'abcdef'

簡単に一時ファイルを使うことができました。

一時ファイルの名前を使いたい

一時ファイルの名前を取得したい場合は NamedTemporaryFile() を使う。

tempfile.NamedTemporaryFile(mode='w+b', buffering=- 1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None)

ファイル名は、ファイルオブジェクトの name属性 からアクセスできます。作成される一時ファイルの名前は環境によって異なります。

import tempfile # 名前付きで一時ファイルを生成 fp = tempfile.NamedTemporaryFile() # 一時ファイルの名前の取得・出力 print(fp.name) # 一時ファイルを閉じる fp.close()

実行結果

/var/folders/m9/9_kjpgcn70jbb0s93r9xhzh40000gr/T/tmpte8ad4n8

delete引数 に False を指定することでファイルを閉じてもすぐには消されないようにできる。

import tempfile import os # 名前付きで一時ファイルを生成 fp = tempfile.NamedTemporaryFile(delete=False) # ファイルの存在確認 print(os.path.isfile(fp.name)) # 一時ファイルを閉じる fp.close() # ファイルの存在確認 print(os.path.isfile(fp.name))

実行結果

True True

posix ではない または cygwin である場合、TemporaryFile には、NamedTemporaryFile が代入されるので注意してください。

if _os.name != 'posix' or _sys.platform == 'cygwin': # On non-POSIX and Cygwin systems, assume that we cannot unlink a file # while it is open. TemporaryFile = NamedTemporaryFile

Linkcpython/tempfile.py at 3.10 · python/cpython · GitHub

with文を使う

どちらの関数も with文 で扱うことができます。

import tempfile with tempfile.TemporaryFile() as fp: fp.write(b'Hello') fp.seek(0) print(fp.read()) with tempfile.NamedTemporaryFile() as fp: print(fp.name)

実行結果

b'Hello' /var/folders/m9/9_kjpgcn70jbb0s93r9xhzh40000gr/T/tmpvxy1g7tv

close() し忘れがなくなるので安全です。

自作クラスをwith文で使う方法【コンテキストマネージャ】

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

View Comments

    Recent Posts

    【Python】yield from の使い方

    この記事では、yield fromの使い…

    2日 ago

    【Unity】BGMやSEを再生する方法

    この記事では、UnityでBGMやSEな…

    2週間 ago

    【Unity】オブジェクトが見えているかどうかを判別する方法

    この記事では、特定のオブジェクトがカメラ…

    3週間 ago

    【Unity】アセットストアにあるアセットを追加・使用する方法

    この記事では、Unityのアセットストア…

    4週間 ago

    【Unity】値が変更された際に処理を実行したい

    この記事では、値が変更された際に何かしら…

    4週間 ago

    【Unity】クラスのパラメータをインスペクターから調整したい

    この記事では、定義したクラスをインスペク…

    4週間 ago