Soal 1Mana yang kamu pakai saat ingin menghapus seluruh folder secara rekursif?
shutil dan tempfile — Operasi File Massal dan Temp File
Pelajari Python shutil dan tempfile dari dasar. Operasi file massal dengan shutil.copy / shutil.move / shutil.rmtree, plus cara aman memakai temporary file via tempfile.NamedTemporaryFile — semuanya praktik langsung.
Artikel ini menelusuri dua modul: shutil, yang beroperasi pada seluruh file dan folder, dan tempfile, yang menangani file sementara yang bisa dibuang. Kamu akan membahas operasi file massal dengan shutil.copy / move / rmtree, cara aman memakai NamedTemporaryFile, dan pola atomic write yang menggabungkan keduanya.
shutil — Operasi File dan Folder dalam Satu Baris
shutil adalah singkatan dari shell utilities — ini standard library yang membuatmu bisa memanggil operasi gaya shell seperti cp / mv / rm -r dari Python dalam satu baris. Modul os punya hal seperti os.rename, tapi shutil menambahkan operasi tingkat lebih tinggi seperti copy folder rekursif dan delete tree.
| Fungsi | Perilaku | Catatan |
|---|---|---|
| shutil.copy(src, dst) | Gandakan file | Jika dst adalah folder, masuk ke dalam dengan nama yang sama |
| shutil.copy2(src, dst) | copy plus metadata seperti waktu modifikasi | Bagus untuk backup |
| shutil.copytree(src, dst) | Gandakan seluruh folder secara rekursif | dst **tidak boleh ada** |
| shutil.move(src, dst) | Pindah atau rename file atau folder | Setara rename saat src dan dst berbagi induk yang sama |
| shutil.rmtree(path) | Hapus folder dan isinya secara rekursif | Tidak bisa dibalik — periksa target dengan teliti sebelum menjalankan |
import shutil
import os
# 1) Salin file ke lokasi lain (backup tipikal)
os.makedirs("backups", exist_ok=True) # Pastikan folder destinasi ada
shutil.copy("data/sales.csv", "backups/sales_2024.csv")
shutil.move("logs/temp.log", "logs/archive_2024.log")
shutil.rmtree("old_data")
rmtree Tidak Bisa Dibatalkan
shutil.rmtree(path) secara fisik menghapus semua di bawah path. Python tidak melewati tempat sampah — langsung hilang. Di proyek nyata, cetak target sebelum menghapus, tambahkan guard seperti if path.startswith("/tmp"), dan bangun kebiasaan yang melindungi baik kamu maupun kodemu.
tempfile — Buat File Sekali Pakai dengan Aman
tempfile adalah standard library untuk temporary file yang otomatis dibersihkan saat kamu selesai dengannya. Kamu memakainya untuk menyimpan hasil antara, buffering data besar, menahan folder kerja tes — apa pun yang hanya perlu ada selama proses berjalan.
Jika kamu membuat nama file sendiri seperti tmp_xxx.txt, kamu berisiko bertabrakan dengan proses lain atau lupa menghapusnya. tempfile malah membuat file di folder temp OS dengan nama yang dijamin unik, dan menghapusnya otomatis saat pekerjaan selesai.
with, dan dihapus otomatis saat kamu meninggalkannya. Nama file diberikan di tempat untuk menghindari tabrakan — kamu tidak memilihnya sendiri.| Fungsi / atribut | Arti | Catatan |
|---|---|---|
| tempfile.NamedTemporaryFile | Temp file yang kamu buka dan tutup dengan `with` | delete=False menyimpannya setelah blok |
| tempfile.mkdtemp() | Mengembalikan path folder temp | Kamu menghapusnya sendiri dengan shutil.rmtree |
| tempfile.gettempdir() | Mengembalikan path folder temp OS | /tmp di Linux, path berbeda di macOS |
| tf.name | Path file sebenarnya (nama random) | Bisa diakses di dalam blok `with` |
| tf.write / tf.read | API yang sama dengan objek file biasa | Pilih 'w' / 'r' / 'w+' via argumen mode |
import tempfile
import os
# Buka aman dengan `with`, lalu auto-delete
with tempfile.NamedTemporaryFile(mode="w+", suffix=".txt", delete=True) as tf:
tf.write("data agregasi antara\n")
tf.seek(0)
print("Content:", tf.read())
print("Path:", tf.name)
# ← Blok berakhir di sini dan file auto-delete
Kapan Menggabungkan delete=False dengan `with`
Saat kamu ingin menulis file dan membacanya kembali nanti dari tempat lain, lewatkan delete=False supaya file bertahan setelah meninggalkan blok with. Setelah selesai dengannya, hapus sendiri dengan os.remove(path) atau swap ke destinasi sebenarnya dengan shutil.move — itu pola atomic write yang dibahas di bawah.
Temp File Auto-Delete dengan `delete=True`
Jika kamu menimpa file config penting atau file state langsung dengan open("settings.json", "w"), crash proses di tengah penulisan bisa meninggalkan file setengah-tertulis, yang lalu gagal di-parse pada pembacaan berikutnya. Cara standar untuk menghindari ini adalah pola "tulis ke temp file lengkap, lalu rename / pindahkan ke path sebenarnya" — dikenal sebagai atomic write (atomic — bahkan jika terinterupsi, pengamat hanya bisa melihat "selesai" atau "belum mulai", tidak pernah keadaan di tengah).
import tempfile
import shutil
import json
final_path = "settings.json"
new_settings = {"theme": "dark", "lang": "en", "fontSize": 14}
# 1) Tulis lengkap ke temp file
with tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".json") as tf:
json.dump(new_settings, tf)
temp_path = tf.name
# 2) Setelah selesai, pindahkan ke path sebenarnya (momen tunggal ini adalah "swap")
shutil.move(temp_path, final_path)
# 3) Verifikasi
with open(final_path) as f:
print(json.load(f))
# → {'theme': 'dark', 'lang': 'en', 'fontSize': 14}
Objek file punya posisi baca/tulis saat ini (cursor), dan memanggil `tf.write(...)` memindahkan cursor tepat setelah apa yang ditulis (= akhir). Memanggil tf.read() dari sana mengembalikan string kosong karena tidak ada apa-apa setelah cursor, jadi langkah standarnya adalah reset cursor ke awal dengan `tf.seek(0)` sebelum membaca.
mode="w+" Adalah Mode Read-Write
`mode="w+"` adalah mode yang membuatmu bisa menulis dan membaca lewat handle file yang sama. Dengan "w" saja kamu hanya bisa menulis dan read() tidak berfungsi; dengan "r" saja kamu hanya bisa membaca dan write() tidak berfungsi. Untuk latihan yang menulis dan langsung membaca kembali, "w+" diperlukan.
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Mana alasan tipikal untuk memakai tempfile.NamedTemporaryFile dengan delete=False?
Soal 3Apa esensi atomic write?