Belajar dengan membaca secara berurutan

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.

Membuka mengambil resource OS — menutup adalah kontraknya
open()OS mengalokasikanFDread / writeclose()melepasopen()OS mengalokasikanFDread / writelupa close-> FD habis+ buffer belum flushnormal
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.

Alur with open()
with open(path, mode)ikatas fpanggil f.read()atau f.write()autocloseblok keluar
Memasuki 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.

Apa yang dikembalikan ketiga method baca
f.read()f.readlines()f.readline()satu strteks penuhlistbarissatu str(panggilanberikut = barisberikut)
read mengembalikan string, readlines mengembalikan list, readline mengembalikan satu string per panggilan. Pilih berdasarkan ukuran data.
# 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.

Klik tombol 📂 Files di atas console kanan, dan kamu akan melihat dua file yang sudah disiapkan data/tasks.txt (4 tugas) dan data/log.txt (3 baris riwayat).

① Pakai with open("data/tasks.txt", "r") as f: untuk membuka file dalam mode baca.

② Baca semua dengan f.read() dan simpan di content.

③ Cetak dengan print(content).

(Kalau kode kamu berjalan dengan benar, penjelasan akan muncul.)

Python Editor

Jalankan kode untuk melihat output

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.

Pakai data/log.txt (3 baris riwayat). Baca sebagai list dengan readlines() dan cetak setiap baris bernomor. Ini pola tipikal untuk tampilan log dan format laporan operasional.

① Buka dengan with open("data/log.txt", "r") as f: dan simpan f.readlines() di lines.

② Loop dengan enumerate(lines, start=1) untuk memulai penomoran dari 1.

③ Lucuti newline di akhir dengan .rstrip() dan cetak sebagai f"{n}: {body}".

Python Editor

Jalankan kode untuk melihat output

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.

readline() membaca satu baris per kali
file(beberapa GB)readline()-> baris 1memori:baris 1(berlanjut)readline()-> baris 2memori:baris 2EOF tercapaireadline()-> ""loopberakhir
Baca satu baris, proses, timpa dengan baris berikutnya — seluruh file tidak pernah hidup di memori. Bahkan file multi-GB hanya memakai "sebanyak baris terpanjang" memori. EOF mengembalikan "" 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.

Sekarang baca data/tasks.txt dengan readline() + walrus operator, satu baris per kali. Use case dunia nyata adalah log raksasa; kita memakai file tasks kecil hanya untuk melihat mekaniknya.

① Buka with open("data/tasks.txt", "r") as f:.

② Loop dengan while line := f.readline(): agar setiap baris masuk ke line.

③ Lucuti newline di akhir dengan .rstrip() dan cetak: print(line.rstrip()).

Python Editor

Jalankan kode untuk melihat output

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

w vs a
sebelum:ABCopen("w")f.write("XYZ")setelah:XYZsebelum:ABCopen("a")f.write("XYZ")setelah:ABCXYZoverwriteappend
w menghapus konten yang ada saat kamu membukanya. a menambah dari akhir. Memilih yang salah bisa menghancurkan log penting — bersikaplah hati-hati.
# 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.

Buat done.txt baru (catatan tugas yang selesai) di dalam folder data/, tulis ke sana, dan baca kembali. Folder data/ sudah ada, jadi pakai langsung di path.

① Buka dengan with open("data/done.txt", "w") as f:.

② Setelah f.write("Tugas selesai:\n"), tulis f.write("Tulis laporan\n") lalu f.write("Balas email\n") — total tiga write.

③ Buka lagi dengan with open("data/done.txt", "r") as f: terpisah dan print(f.read()) untuk menampilkan seluruh konten.

④ Setelah dijalankan, klik tombol 📂 Files di header — kamu akan melihat data/done.txt terdaftar di panel.

Python Editor

Jalankan kode untuk melihat output

Reproduksi state data/done.txt dari latihan terakhir, lalu tambahkan item baru ke akhir. Rasakan perbedaan antara w dan a dalam satu script.

① Mulai dengan with open("data/done.txt", "w") as f: dan f.write("Tugas selesai:\nTulis laporan\n") untuk mengatur konten awal (ini mereset file setiap dijalankan).

② Lalu dengan with open("data/done.txt", "a") as f:, tambahkan f.write("Balas email\n").

③ Akhirnya, buka dengan "r" lagi dan print(f.read()) untuk verifikasi.

Python Editor

Jalankan kode untuk melihat output

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

data/products.txt menyimpan 4 baris dalam bentuk "name,price". Baca, hitung total, dan tulis hasilnya ke file terpisah data/total.txt.

① Buka dengan with open("data/products.txt", "r") as f: dan ambil list dengan f.readlines().

② Untuk setiap baris, jatuhkan newline di akhir dengan .rstrip() dan split pada "," untuk mendapat name dan price. Price adalah string, jadi konversi dengan int() sebelum menambah.

③ Buka with open("data/total.txt", "w") as f: dan tulis hasilnya dengan f.write(f"total: {total}\n").

④ Verifikasi dengan membuka dengan "r" dan print(f.read()).

Python Editor

Jalankan kode untuk melihat output

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.

QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Apa arti argumen kedua "r" di with open("data/notes.txt", "r") as f:?

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?