実践・上級問題チェック
問題 29 /40
create_temp_file()関数を呼び出した後も、一時ファイルが存在している状態になり、ファイルパスとして利用できるものはどれか。
以下は各選択肢の共通コードである。
import tempfile
from pathlib import Path
選択 1
def create_temp_file():
with tempfile.NamedTemporaryFile(delete=False) as f:
path = Path(f.name)
print(path.exists())
return path
選択 2
def create_temp_file():
with tempfile.NamedTemporaryFile() as f:
path = Path(f.name)
print(path.exists())
return path
選択 3
def create_temp_file():
with tempfile.TemporaryFile() as f:
path = Path(f.name)
print(path.exists())
return path
選択 4
def create_temp_file():
with tempfile.TemporaryDirectory() as d:
path = Path(d)
print(path.exists())
return path
解説
選択肢1が正解です。
一時ファイルは、外部コマンドにファイルパスを渡したり、関数の引数にファイルパスを渡す際に利用します。
NamedTemporaryFile()などで作成した一時ファイルは、デフォルトではclose処理が行われたタイミングで削除されます。with文は必ずclose処理が行われるため、通常はwith文で使います。
with文を抜けた後もファイルパスを使う場合は、delete=Falseを指定して、ファイルが削除されないようにする必要があります。
以下は各選択肢の共通コードです。
import tempfile
from pathlib import Path
【選択肢1】
def create_temp_file():
with tempfile.NamedTemporaryFile(delete=False) as f:
path = Path(f.name)
print(path.exists())
return path
正しい記述です。
NamedTemporaryFile()は、名前(パス)を持つ一時ファイルを作成します。delete=Falseの引数をつけると、with文を抜けた後もファイルを削除しません。
そのため、path.exists()はTrueになり、create_temp_file()を呼び出した後でもファイルパスを他の処理へ渡すことができます。
この場合は一時ファイルがディスクに残るため、使い終わった後はpath.unlink()で削除します。
なお、tempfileモジュールでdelete引数が使えるのは、NamedTemporaryFile()だけです。
【選択肢2】
def create_temp_file():
with tempfile.NamedTemporaryFile() as f:
path = Path(f.name)
print(path.exists())
return path
誤った記述です。
NamedTemporaryFile()を使っていますが、delete引数を指定していないため、with文を抜けた時点でファイルが自動的に削除されます。
そのためpath.exists()はFalseが返り、with文を抜けた後に一時ファイルを使おうとするとFileNotFoundErrorが発生します。
【選択肢3】
def create_temp_file():
with tempfile.TemporaryFile() as f:
path = Path(f.name)
print(path.exists())
return path
誤った記述です。
TemporaryFile()は名前つきファイルを作成することを保証していないため、ファイルをパスとして扱うことはできません。
環境や実装によっては、Path(f.name)の時点で例外が発生する可能性があります。
TemporaryFile()は一時的にディスクを使いたい場合に使います。例えば、大きなデータを一時的にファイルに退避させて処理したり、メモリに載せられないサイズのデータを一時ファイルとして扱う場合です。
【選択肢4】
def create_temp_file():
with tempfile.TemporaryDirectory() as d:
path = Path(d)
print(path.exists())
return path
誤った記述です。
TemporaryDirectory()はファイルではなくディレクトリを作成します。
TemporaryDirectory()は複数の一時ファイルを生成する場合や、外部ツールがディレクトリ単位で出力を行う場合に使います。
with文を抜けるとディレクトリ配下がまとめて削除されるため、後始末を意識せずに安全に使えます。
(公式書籍 p.256-257)