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—asdipakai kalau objeknya ingin dirujuk dengan nama.
Ringkasan
withmembuka file dan menutupnya otomatis, bahkan saat terjadi error- Bentuknya
with open(...) as file:, kode di dalamnya diindentasi - Tidak perlu memanggil
close()saat memakaiwith - Beberapa file bisa dibuka sekaligus dalam satu
with - Objek yang mendukung
withdisebut context manager withadalah 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.
