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

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago