Belajar dengan membaca secara berurutan

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.

Tiga Fungsi Inti shutil
shutil.copy(src, dst)Buat salinanshutil.move(src, dst)Pindah atau renameshutil.rmtree(path)Hapus rekursif
copy menggandakan file ke lokasi lain, move memindahkannya (atau merename di tempat), dan rmtree menghapus seluruh folder secara rekursif. Tiga ini mencakup sebagian besar operasi sehari-hari.
FungsiPerilakuCatatan
shutil.copy(src, dst)Gandakan fileJika dst adalah folder, masuk ke dalam dengan nama yang sama
shutil.copy2(src, dst)copy plus metadata seperti waktu modifikasiBagus untuk backup
shutil.copytree(src, dst)Gandakan seluruh folder secara rekursifdst **tidak boleh ada**
shutil.move(src, dst)Pindah atau rename file atau folderSetara rename saat src dan dst berbagi induk yang sama
shutil.rmtree(path)Hapus folder dan isinya secara rekursifTidak 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.

Backup file CSV penjualan data/sales.csv sebagai backups/sales_backup.csv. Kamu bisa memeriksa file asli dari panel 📂 Files di kiri.

① Mohon impor shutil dan os.

② Mohon siapkan folder destinasi backups/ (dengan cara yang tidak error jika sudah ada).

③ Mohon salin file ke nama destinasi di atas.

④ Mohon verifikasi backup dan asli dengan mencetak Backup done: True / Source still exists: True.

(Jika kamu menjalankannya dengan benar, penjelasan muncul di bawah.)

Python Editor

Jalankan kode untuk melihat output

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.

Lifecycle NamedTemporaryFile
with NamedTemporaryFile():→ Temp file dibuatDi dalam blok:write dan readKeluar dari blok→ Auto-deletePakai dengan amantanpa pembersihan
File dibuat saat kamu masuk ke blok with, dan dihapus otomatis saat kamu meninggalkannya. Nama file diberikan di tempat untuk menghindari tabrakan — kamu tidak memilihnya sendiri.
Fungsi / atributArtiCatatan
tempfile.NamedTemporaryFileTemp file yang kamu buka dan tutup dengan `with`delete=False menyimpannya setelah blok
tempfile.mkdtemp()Mengembalikan path folder tempKamu menghapusnya sendiri dengan shutil.rmtree
tempfile.gettempdir()Mengembalikan path folder temp OS/tmp di Linux, path berbeda di macOS
tf.namePath file sebenarnya (nama random)Bisa diakses di dalam blok `with`
tf.write / tf.readAPI yang sama dengan objek file biasaPilih '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.

Buat temp file, tulis ke dalamnya, lalu cek apakah ada sebelum dan sesudah penghapusan. Buka NamedTemporaryFile dengan delete=False, tulis ke dalamnya, baca kembali, cek keberadaan sebelum penghapusan, hapus, lalu cek keberadaan lagi.

① Mohon impor tempfile dan os.

② Mohon buka temp file dengan NamedTemporaryFile(mode="w", delete=False), tulis string sales total: 3750 ke dalamnya, simpan tf.name ke variabel path, dan keluar dari blok with.

③ Mohon cetak keberadaan dengan os.path.exists(path) dalam bentuk Exists before delete: ◯◯.

④ Mohon hapus file dengan os.unlink(path).

⑤ Mohon cetak keberadaan lagi dengan os.path.exists(path) dalam bentuk Exists after delete: ◯◯.

Python Editor

Jalankan kode untuk melihat output

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).

Alur Atomic Write
Open langsung("w")Crash di tengah penulisanFile rusaktertinggalTulis lengkapke tempfileshutil.move kepath sebenarnyaSwap instandari luarKeadaan rusaktidak pernah terlihat
Menulis langsung meninggalkan file rusak saat crash, tapi lewat temp file menukar ke path sebenarnya hanya pada saat penulisan selesai — jadi keadaan rusak tidak pernah terlihat.
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.

Bagaimana File Cursor dan seek(0) Berperilaku
write("config: ok")Cursor → akhirread()→ "" (kosong)seek(0)Cursor → awalread()→ "config: ok"
write memindahkan cursor ke akhir → membaca dari sana mengembalikan string kosongseek(0) membawa cursor kembali ke awal → read mengembalikan apa yang kamu tulis.

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.

Buat temp file dengan `with NamedTemporaryFile(delete=True)` dan konfirmasi auto-delete-nya. Tulis ke dalamnya di dalam blok with, baca kembali, lalu cek keberadaan setelah blok keluar — harus False.

① Mohon impor tempfile dan os.

② Mohon buka tempfile.NamedTemporaryFile(mode="w+", delete=True) dengan pernyataan with (mode="w+" adalah read-write).

③ Di dalam blok, mohon tulis tf.write("config: ok\n"), reset cursor ke awal dengan tf.seek(0), baca kembali dengan tf.read(), dan cetak sebagai Content: ◯◯.

④ Mohon simpan path di dalam blok sebagai saved_path = tf.name.

⑤ Setelah meninggalkan blok, mohon cetak hasil os.path.exists(saved_path) dalam bentuk Exists after with: ◯◯ (harus False).

Python Editor

Jalankan kode untuk melihat output
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Mana yang kamu pakai saat ingin menghapus seluruh folder secara rekursif?

Soal 2Mana alasan tipikal untuk memakai tempfile.NamedTemporaryFile dengan delete=False?

Soal 3Apa esensi atomic write?