Soal 1Apa arti argumen kedua "r" di with open("data/notes.txt", "r") as f:?
File I/O — Baca dan Tulis Aman dengan with open()
Pelajari file I/O Python. Auto-close with open(), perbedaan read / readlines / readline, mode w / a, dan pola read-process-write yang menyimpan ke file terpisah — hands-on.
Sebagian besar data yang ditangani program berada di disk sebagai file. Membaca daftar tugas, menambah ke log, memuat config — semuanya operasi sehari-hari.
Di Python, with open() memungkinkan kamu melakukan ini dalam satu unit sintaktis yang aman. Artikel ini membahas bentuk dasar with open(), tiga method baca (read / readlines / readline), menulis (w) dan menambah (a), dan menangani path dengan direktori — dengan benar-benar menjalankan kode terhadap file.
with open() Membuka dan Menutup File dengan Aman
Membuka file adalah operasi yang membuat OS menahan resource, dan begitu dibuka, kamu harus menutupnya. Lupa menyebabkan kehabisan file descriptor, atau data tulis terjebak di buffer dan tidak pernah mencapai disk.
open() membuat OS mengalokasikan file descriptor (FD). Sampai close(), FD tetap dipegang dan tulisan tetap ter-buffer, belum ter-flush. Lupa menutup adalah resource leak serius.Apa itu file descriptor (FD)?
FD (file descriptor) adalah ID integer yang ditugaskan OS untuk setiap file yang sedang terbuka. Setiap open() membagikan FD baru; close() mengembalikannya ke OS. OS menetapkan batas atas per-proses (default Linux sekitar 1.024). Capai batas itu dan panggilan open() baru mulai gagal dengan OSError: Too many open files. Bahaya lupa-tutup adalah persis ini: memegang resource terbatas selamanya.
Tulis bentuk with open(path, mode) as f: dan file otomatis menutup begitu kamu meninggalkan blok, jadi kesalahannya mustahil dibuat. f di as f adalah variabel yang menerima object file; di dalam blok with, kamu membaca dan menulis lewat f.
Path memakai forward slash / untuk memisahkan direktori. open("data/tasks.txt", "r") membuka tasks.txt di dalam folder data di bawah direktori saat ini. Bahkan di Windows, konvensi Python memakai / — secara internal, ini diterjemahkan per OS.
with membuka file dan mengikatnya ke as f. Meninggalkan blok — normal atau via exception — close() berjalan otomatis.Membaca — read / readlines / readline
Untuk membaca file, pakai r (read) sebagai argumen kedua open(path, "r"). Object file yang dikembalikan punya tiga method baca untuk kebutuhan berbeda.
- f.read() — membaca seluruh file sebagai satu string.
- f.readlines() — membaca sebagai list baris (string).
- f.readline() — membaca satu baris. Panggilan berulang melaju ke baris berikutnya; string kosong "" menandakan akhir file.
# Ambil seluruh file sebagai satu string
with open("data/tasks.txt", "r") as f:
content = f.read()
print(type(content)) # <class 'str'>
# Ambil list baris
with open("data/tasks.txt", "r") as f:
lines = f.readlines()
print(type(lines)) # <class 'list'>
# Ambil satu baris per kali (panggilan berikut -> baris berikut)
with open("data/tasks.txt", "r") as f:
first = f.readline() # "Tulis laporan\n"
second = f.readline() # "Balas email\n"
Mulai sekarang, console berjalan di virtual file system (VFS) sisi browser
Console di kanan adalah virtual file system di browser — file seperti data/tasks.txt sudah disiapkan untukmu. Untuk menjalankan kode yang sama di PC lokalmu, buat folder data/ di samping file Python kamu (mis., main.py) dan letakkan tasks.txt di dalamnya sebelum menjalankan. Sintaks path ("data/tasks.txt" dengan /) identik dengan Python sungguhan.
Saat file adalah satu record per baris (CSV tanpa header, list dipisah newline, baris log), f.readlines() nyaman. Itu mengembalikan list string, satu per baris, dan setiap elemen menyimpan \n di akhirnya.
Mencetaknya langsung menghasilkan jarak ganda, jadi pola standar adalah menerapkan .rstrip("\n") untuk menjatuhkan newline di akhir.
File besar? Baca baris demi baris — readline dan walrus
f.read() dan f.readlines() memuat seluruh file ke memori. Itu OK untuk file ukuran config, tetapi log server multi-GB bisa membuat program crash karena kehabisan memori.
f.readline() memuat hanya satu baris per kali, jadi penggunaan memori tetap di sebanyak satu baris. Saat readline() mencapai akhir file, ia mengembalikan string kosong "", yang kamu pakai sebagai kondisi keluar loop.
"" untuk memberi tahu loop berhenti.# Gaya klasik: break pada string kosong
with open("data/log.txt", "r") as f:
while True:
line = f.readline()
if not line: # string kosong = EOF
break
print(line.rstrip())
Walrus operator := menulis hal yang sama dengan satu baris lebih sedikit
Python 3.8 memperkenalkan walrus operator (:=), yang memungkinkanmu assign dan periksa di dalam expression. Menulis while line := f.readline(): berarti "taruh hasil readline() ke line, dan terus loop selama tidak kosong" — seluruh loop dalam satu baris.
Menulis — mode w dan mode a
Menulis hanya open() dengan argumen kedua berbeda. Dua mode membawa beban praktis.
- "w" (write) — buat baru atau overwrite. Konten yang ada dihancurkan.
- "a" (append) — tambah ke akhir. Konten yang ada tetap.
Dua method tulis juga ada. f.write(s) menulis string s langsung; f.writelines(lst) menulis list string sekaligus. Kalau path menyertakan folder, file dibuat di dalamnya (folder harus sudah ada).
# Mode w: tulis string satu per satu
with open("data/done.txt", "w") as f:
f.write("Tulis laporan\n")
f.write("Balas email\n")
# Mode w: tulis list sekaligus dengan writelines
with open("data/done.txt", "w") as f:
f.writelines(["Tulis laporan\n", "Balas email\n", "Hadiri rapat\n"])
# Mode a: tambah ke akhir
with open("data/done.txt", "a") as f:
f.write("Belanja\n")
Newline \n tidak ditambah otomatis
Tidak seperti print(), baik f.write() maupun f.writelines() tidak menambah newline untukmu. Memanggil f.write("Halo") dua kali memberimu HaloHalo di file. Sisipkan \n eksplisit di mana pun kamu benar-benar ingin pemisah baris.
Lebih jauh — Analisis file dan simpan hasilnya ke file lain
Salah satu pola paling umum di pekerjaan nyata adalah baca file input, lakukan beberapa analisis, dan tulis hasilnya ke file terpisah. Cukup pakai open() dua kali — sekali dengan "r", sekali dengan "w". Gaya paling bersih adalah menempatkan input → proses → output ke dalam tiga blok with terpisah.
# Analisis data/log.txt dan simpan hasil ke data/log_summary.txt
# (1) Input: baca log ke list baris
with open("data/log.txt", "r") as src:
lines = src.readlines()
# (2) Proses: hitung baris, ambil entri pertama/terakhir
total = len(lines)
first = lines[0].rstrip()
last = lines[-1].rstrip()
summary = f"count: {total}\nfirst: {first}\nlast: {last}\n"
# (3) Output: tulis ke file berbeda
with open("data/log_summary.txt", "w") as dst:
dst.write(summary)
print("Saved analysis to data/log_summary.txt")
encoding="utf-8" adalah standar untuk encoding teks
Di Python sungguhan, kamu biasanya menulis open(path, "r", encoding="utf-8") untuk menentukan encoding secara eksplisit. Mencoba membaca file Shift-JIS sebagai UTF-8 memunculkan UnicodeDecodeError, dan sebaliknya mojibake diam-diam. Standar dunia adalah UTF-8 — tulis file baru dalam UTF-8 secara default. Lingkungan browser meng-hardcode UTF-8 secara internal jadi menghilangkan encoding= jalan di sini, tetapi jadikan kebiasaan saat menulis script lokal.
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Saat kamu memanggil f.readline() berulang dan file berakhir, nilai apa yang kembali?
Soal 3Kalau data/done.txt sudah punya konten dan kamu membukanya dengan with open("data/done.txt", "w") as f:, apa yang terjadi pada konten yang ada?