Kadang program butuh berkas atau folder hanya untuk sementara: hasil antara yang terlalu besar untuk memori, berkas keluaran yang dibaca proses lain, atau data uji yang tak boleh mengotori proyek. Cara manual — membuat berkas berpola nama tetap seperti hasil.tmp — menyimpan tiga masalah: dua program yang berjalan bersamaan saling menimpa, berkas lama menumpuk karena lupa dihapus, dan nama yang mudah ditebak membuka celah keamanan. Module tempfile dari standard library menyelesaikan ketiganya.
TemporaryFile — Scratch Tanpa Jejak #
Fungsi tempfile.TemporaryFile() membuat berkas yang langsung dipakai dan lenyap begitu ditutup:
import tempfile
with tempfile.TemporaryFile(mode="w+", encoding="utf-8") as berkas:
print("Mode berkas :", berkas.mode)
berkas.write("Data sementara di temporary file.\n")
berkas.seek(0)
print("Isi :", berkas.read(), end="")
print("Setelah blok with, berkas.closed =", berkas.closed)Output yang Dihasilkan:
Mode berkas : w+
Isi : Data sementara di temporary file.
Setelah blok with, berkas.closed = TrueMari kita amati perilakunya:
- Baris 3 (
mode="w+"): secara defaultTemporaryFile()dibuka dalam mode binerw+b; argumentmode="w+"plusencodingmengubahnya menjadi mode teks supaya bisa menerima string. - Baris 6 (
berkas.seek(0)): setelah menulis, posisi berkas berada di akhir;seek(0)memutarnya kembali ke awal agar isi bisa dibaca ulang. - Baris 9: baris ini tercapai hanya setelah blok
withberakhir — berkas sudah tertutup otomatis, dan bersama penutupan itu berkasnya ikut terhapus.
Di Linux, TemporaryFile() bahkan memakai kemampuan berkas tanpa nama (O_TMPFILE): berkas tidak pernah muncul di daftar direktori mana pun, jadi tidak bisa ditemukan program lain. Inilah pilihan terbersih untuk data perantara yang tidak perlu dilihat siapa pun.
NamedTemporaryFile — Saat Nama Dibutuhkan #
Beberapa situasi menuntut berkas punya nama sungguhan: diteruskan ke program eksternal lewat command line, atau dibuka handle kedua oleh library lain. Fungsi NamedTemporaryFile() menyediakannya:
import tempfile
from pathlib import Path
with tempfile.NamedTemporaryFile(
mode="w+", encoding="utf-8", prefix="demo-", suffix=".txt"
) as berkas:
print("Awalan cocok :", Path(berkas.name).name.startswith("demo-"))
print("Akhiran cocok:", Path(berkas.name).name.endswith(".txt"))
berkas.write("Catatan sementara")
berkas.seek(0)
print("Isi :", berkas.read())
nama = berkas.name
print("Masih ada di disk?", Path(nama).exists())Output yang Dihasilkan:
Awalan cocok : True
Akhiran cocok: True
Isi : Catatan sementara
Masih ada di disk? FalseNama berkas berbentuk acak — misalnya demo-x7k3p9qm.txt — nilai pastinya berbeda di setiap eksekusi. Argument prefix dan suffix hanya memberi bingkai agar mudah dikenali. Secara default (delete=True) berkas terhapus saat ditutup; bila berkasnya harus bertahan setelah program berakhir, panggil dengan delete=False lalu hapus manual dengan Path.unlink() setelah selesai.
TemporaryDirectory — Folder Sementara #
Fungsi TemporaryDirectory() adalah versi foldernya, dan pola with-nya sama persis:
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as folder:
folder_path = Path(folder)
print("Di dalam blok, folder_path.exists() =", folder_path.exists())
berkas_sementara = folder_path / "hasil-hitung.txt"
berkas_sementara.write_text("hasil: 42", encoding="utf-8")
print(berkas_sementara.read_text(encoding="utf-8"))
print("Setelah blok, folder_path.exists() =", folder_path.exists())Output yang Dihasilkan:
Di dalam blok, folder_path.exists() = True
hasil: 42
Setelah blok, folder_path.exists() = FalseDi dalam blok, folder beserta seluruh isinya bisa kita perlakukan seperti folder biasa — membuat berkas, membaca kembali, menjalankan program lain dengan output di sana. Saat blok berakhir, seluruh pohon isinya terhapus otomatis, tidak peduli berapa banyak berkas yang sempat dibuat.
mkdtemp — Kontrol Penuh, Bersih Sendiri #
Fungsi tempfile.mkdtemp() juga membuat folder unik, tetapi tanpa with dan tanpa pembersihan otomatis — tanggung jawabnya penuh di tangan kita:
import shutil
import tempfile
from pathlib import Path
folder = Path(tempfile.mkdtemp(prefix="uji-"))
print("Folder dibuat, exists() =", folder.exists())
(folder / "data.txt").write_text("data uji", encoding="utf-8")
shutil.rmtree(folder)
print("Setelah rmtree, exists() =", folder.exists())Output yang Dihasilkan:
Folder dibuat, exists() = True
Setelah rmtree, exists() = Falsemkdtemp() cocok ketika folder harus hidup lebih lama dari satu blok kode — misalnya diserahkan ke fixture pengujian atau dipakai lintas function. Bersihkan dengan shutil.rmtree() seperti contoh di atas.
Kapan Memakai temporary files #
Kasus pemakaian paling umum: pengujian (menulis data uji ke folder sementara yang otomatis bersih setelah tiap sesi), pemrosesan data besar (menumpahkan hasil antara ke disk alih-alih menahannya di memori), dan pertukaran dengan program eksternal. Semua fungsi tempfile menjamin nama unik sehingga dua program berjalan bersamaan tidak pernah bertabrakan, dan di platform yang mendukung, berkas dibuat dengan izin akses terbatas hanya untuk pemiliknya — dua hal yang sulit dijamin oleh penamaan manual. Sebagai aturan praktis: mulailah dari TemporaryDirectory() karena pola with-nya paling sulit salah, lalu turun ke fungsi lain saat kebutuhannya memang lebih spesifik.