実践・中級問題チェック
問題 30 /40
tempfileモジュールに関する説明で、誤っているものはどれか。
選択 1
TemporaryFile()は、ファイル名のない一時ファイルをディスク上に作成する。
選択 2
NamedTemporaryFile()は、ファイル名がある一時ファイルをディスク上に作成する。
選択 3
SpooledTemporaryFile()は、一定サイズまではデータがメモリ上で処理され、それを超えると一時ファイルの作成を中止する。
選択 4
TemporaryDirectory()は、一時ディレクトリを作成する。
解説
選択肢3が正解です。
tempfileモジュールは、一時的なファイルやディレクトリを作成する標準ライブラリです。不要になれば自動的に削除されるため、手動で一時ファイルを管理するよりも安全に使えます。
主な特徴は次の通りです。
■ TemporaryFile()
名前のない一時ファイルを作成
■ NamedTemporaryFile()
名前のある一時ファイルを作成
■ SpooledTemporaryFile()
データ容量が小さいうちはメモリ上、大きくなるとディスクへ移行
■ TemporaryDirectory()
一時ディレクトリを作成
【選択肢1】
TemporaryFile()は、ファイル名のない一時ファイルをディスク上に作成する。
正しい説明です。
データが大量でメモリに展開できない場合、通常はジェネレーターを使います。ただ、外部ライブラリがファイルオブジェクトを要求している場合は、TemporaryFile()を使ってディスク上に一時ファイルを作成することがあります。
■ 小さなデータをメモリに展開する例
data = [i*2 for i in range(10)]
print('合計:', sum(data))
■ 大量なデータをディスクに書き込む例
import tempfile
with tempfile.TemporaryFile(mode='w+t') as tmp:
for i in range(1000000):
tmp.write(f'{i*2}\n')
tmp.seek(0)
total = sum(int(line) for line in tmp)
print('合計:', total)
mode='w+t'は、テキストで読み書きする指定です。
tmp.seek(0)はカーソルを先頭に戻す処理です。これがないとtmp.write()でカーソルが最後の行に留まり、データがsum関数に渡らないことがあります。
カーソルとは「ファイルの中で今どこを読んでいるか/書いているか」を指す位置のことです。
【選択肢2】
NamedTemporaryFile()は、ファイル名がある一時ファイルをディスク上に作成する。
正しい説明です。
関数やメソッドに、ファイル名(パス)を渡す必要がある場合に使います。
import tempfile
def process_file(path):
with open(path) as f:
print('外部処理:', f.read())
with tempfile.NamedTemporaryFile(mode='w+t', delete=True) as tmp:
tmp.write('data')
tmp.seek(0)
process_file(tmp.name)
最後のprocess_file(tmp.name)のtmp.nameが一時ファイルの名前です。
選択肢1のTemporaryFile()は匿名ファイルのため、関数にファイルオブジェクトを渡すことはできますが、ファイル名を渡すことはできません。
【選択肢3】
SpooledTemporaryFile()は、一定サイズまではデータがメモリ上で処理され、それを超えると一時ファイルの作成を中止する。
誤った説明です。
一定サイズまではデータがメモリ上で処理され、それを超えると一時ファイルをディスク上に作成します。
import tempfile
with tempfile.SpooledTemporaryFile(max_size=20, mode='w+t') as tmp:
tmp.write('A' * 5)
tmp.write('B' * 30)
max_size=20は、20バイトを超えた場合にディスクに作成する指定です。
tmp.write('A' * 5)は5バイトのため、メモリ上に展開されます。
tmp.write('B' * 30)で合計35バイトになり20バイトを超えるため、tmpはディスクに作成されます。
【選択肢4】
TemporaryDirectory()は、一時ディレクトリを作成する。
正しい説明です。
一時的に作業するワークスペースとして利用します。
import tempfile
import os
with tempfile.TemporaryDirectory() as tmpdir:
print(tmpdir)
print(os.path.exists(tmpdir))
▶︎ True(存在する)
print(os.path.exists(tmpdir))
▶︎ False(存在しない)
別のライブラリにディレクトリとして渡す必要がある場合や、一時的に大量のファイルを保管する場合に利用します。
with文を抜けるとディレクトリが自動削除されます。選択肢1・2・3も同様に、with文を抜けると削除されます。
(公式書籍 p.255)