Langsung ke konten

with Statement di Python: Membuka File dengan Aman

with statement menutup file secara otomatis setelah selesai dipakai. Artikel ini membahas context manager dan kenapa with lebih aman daripada open manual.

Belajar Python Level Basic
Belajar Python Level Basic
Advertisement

Artikel ini bagian dari seri Belajar Python Level Basic di hanifmu.com. Di artikel sebelumnya kita sudah membahas Menulis File. Sekarang kita rapikan cara membukanya.

Di dua artikel sebelumnya, setiap file harus ditutup dengan close(). Kalau ada satu saja yang terlewat, data bisa tidak tersimpan atau file tetap terkunci. Python menyediakan cara yang lebih rapi.

Masalah dengan open() Manual

Perhatikan kode berikut:

file = open("data.txt", "r")
isi = file.read()
file.close()

Terlihat aman, sampai ada error di tengah jalan:

file = open("data.txt", "r")
isi = file.read()
angka = int(isi)   # ValueError kalau isi bukan angka
file.close()       # baris ini tidak pernah jalan

Kalau int(isi) gagal, program melompat keluar sebelum close() dipanggil. File pun dibiarkan terbuka. Untuk satu-dua file mungkin tidak terasa, tapi di program besar ini bisa menumpuk dan menghabiskan sumber daya.

Solusi sementaranya memang try dan finally:

file = open("data.txt", "r")
try:
    isi = file.read()
    print(isi)
finally:
    file.close()

Ini benar, tapi cukup panjang untuk pekerjaan sesederhana membuka file. Python punya cara yang lebih singkat.

with Statement

with membuka file dan menjamin penutupannya, bahkan saat terjadi error:

with open("data.txt", "r") as file:
    isi = file.read()
    print(isi)

Begitu blok with selesai, file otomatis ditutup. Kamu tidak perlu memanggil close() sama sekali. Kalau ada exception di dalam blok, file tetap ditutup sebelum error diteruskan.

Struktur umumnya:

with open(...) as nama_variabel:
    kode yang memakai file

Kode di dalam blok harus diindentasi. Setelah blok berakhir, file sudah tertutup dan tidak bisa dipakai lagi.

with untuk Menulis

Cara ini juga berlaku untuk menulis:

with open("hasil.txt", "w", encoding="utf-8") as file:
    file.write("Baris pertama\n")
    file.write("Baris kedua\n")

Tidak ada close() di mana pun, tapi isinya tersimpan dengan benar saat blok selesai.

Contoh menambahkan data:

with open("log.txt", "a", encoding="utf-8") as file:
    file.write("Program dijalankan\n")

Kenapa with Lebih Aman?

Manfaat utama with adalah jaminan penutupan file. Bandingkan:

# Tanpa with
file = open("data.txt", "r")
isi = file.read()
file.close()

# Dengan with
with open("data.txt", "r") as file:
    isi = file.read()

Keduanya menghasilkan hal yang sama saat tidak ada masalah. Bedanya muncul saat ada error:

with open("data.txt", "r") as file:
    isi = file.read()
    angka = int(isi)   # error di sini

Meski int(isi) gagal, file tetap ditutup. Program tetap melaporkan errornya, tapi tidak meninggalkan file yang menggantung.

Ringkasnya, with memberi:

  • File selalu tertutup, baik normal maupun saat error.
  • Kode lebih pendek karena tidak ada close().
  • Sumber daya tidak bocor meski kode di dalam blok panjang.

with untuk Beberapa File

Beberapa file bisa dibuka sekaligus dalam satu with:

with open("sumber.txt", "r", encoding="utf-8") as sumber, \
     open("tujuan.txt", "w", encoding="utf-8") as tujuan:
    for baris in sumber:
        tujuan.write(baris.upper())

Kode ini menyalin isi sumber.txt ke tujuan.txt sambil mengubah hurufnya menjadi kapital. Kedua file ditutup otomatis di akhir.

Context Manager

with tidak hanya untuk file. Banyak objek Python mendukungnya. Objek yang bisa dipakai dengan with disebut context manager, yaitu objek yang mengatur sumber daya dari pembukaan sampai penutupan.

Contoh dengan lock untuk mengatur akses:

import threading

lock = threading.Lock()

with lock:
    print("Bagian ini hanya dijalankan satu thread")

Contoh lain, membuka koneksi database:

with koneksi_database() as db:
    db.simpan(data)

Untuk file sendiri, with adalah cara yang dianjurkan sejak awal. Kebiasaan ini akan terpakai lagi saat bekerja dengan database atau koneksi jaringan di level lanjutan.

Contoh Program: Menyalin dan Menghitung Baris

Mari salin file sambil menghitung jumlah barisnya:

# salin_file.py

try:
    with open("sumber.txt", "r", encoding="utf-8") as sumber, \
         open("salinan.txt", "w", encoding="utf-8") as salinan:
        jumlah = 0
        for baris in sumber:
            salinan.write(baris)
            jumlah += 1
except FileNotFoundError:
    print("File sumber.txt tidak ditemukan")
else:
    print(f"{jumlah} baris berhasil disalin")

Dengan with, kedua file dijamin tertutup baik saat berhasil maupun saat file sumber tidak ditemukan.

Kesalahan Umum Pemula

  • Memakai variabel file di luar blok with — file sudah tertutup, operasi akan error.
  • Lupa indentasi di dalam with — kode dianggap berada di luar blok.
  • Menulis close() di dalam with — tidak perlu dan bisa membingungkan.
  • Mengira with hanya untuk file — banyak context manager lain, seperti lock dan koneksi.
  • Memakai with tanpa as — as dipakai kalau objeknya ingin dirujuk dengan nama.

Ringkasan

  • with membuka file dan menutupnya otomatis, bahkan saat terjadi error
  • Bentuknya with open(...) as file:, kode di dalamnya diindentasi
  • Tidak perlu memanggil close() saat memakai with
  • Beberapa file bisa dibuka sekaligus dalam satu with
  • Objek yang mendukung with disebut context manager
  • with adalah cara yang dianjurkan untuk membuka file

Langkah Selanjutnya

Kamu sudah bisa membaca dan menulis file dengan cara yang aman. Tapi selama ini kita menyimpan data sebagai teks biasa, tanpa aturan format.

Artikel selanjutnya membahas Membaca dan Menulis CSV dan JSON di Python, dua format data yang paling sering dipakai untuk bertukar informasi.