実践・中級問題チェック

問題 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)