Menu

Penanganan file di Python: membaca, menulis, dan menambah isi file dengan aman

Cara membaca dan menulis file di Python: pernyataan with, mode teks vs biner, dan API modern berbasis path yang lebih aman.

File hanyalah string yang punya path

Kebanyakan program pada akhirnya perlu membaca atau menulis file: konfigurasi, data pengguna, log, ekspor CSV, cache kecil. Python membuatnya sederhana dengan satu fungsi bawaan, open(), ditambah blok with untuk memastikan semuanya ditutup dengan rapi.

Mari kita bahas kasus-kasus yang umum.

Membaca seluruh file

Cara membaca yang paling sederhana:

with open("notes.txt") as f:
    contents = f.read()

print(contents)

open("notes.txt") membuka file untuk dibaca (default-nya). Blok with berarti Python akan menutup file saat kamu keluar dari blok, bahkan kalau ada exception. Setelah ditutup, kamu tidak bisa memakai f lagi; teksnya tersimpan di contents.

contents adalah satu string berisi seluruh file. Tidak masalah untuk file kecil; buruk untuk log berukuran 2 GB.

Membaca baris per baris

Untuk file yang lebih besar, lakukan iterasi alih-alih membaca semuanya ke memori:

with open("big.log") as f:
    for line in f:
        if "ERROR" in line:
            print(line.strip())

Setiap iterasi menghasilkan satu baris termasuk newline di akhirnya, itulah sebabnya .strip() sering sekali muncul. Kalau kamu ingin list berisi baris-baris, f.readlines() bisa melakukannya, tapi biasanya iterasi langsung adalah yang kamu inginkan.

Untuk menulis, berikan mode sebagai argumen kedua:

with open("output.txt", "w") as f:
    f.write("first line\n")
    f.write("second line\n")

Dua hal yang perlu diperhatikan:

  • "w" menimpa. Kalau output.txt sudah ada, isinya langsung hilang begitu open berjalan.
  • Kamu harus menambahkan newline sendiri. f.write("hello") menulis tepat lima karakter itu, tanpa newline di akhir.

Untuk menambah isi, bukan menimpa:

with open("output.txt", "a") as f:
    f.write("another line\n")

Kamu juga bisa memasukkan beberapa baris sekaligus dengan writelines:

lines = ["a\n", "b\n", "c\n"]
with open("letters.txt", "w") as f:
    f.writelines(lines)

Aturannya sama: kamu yang menyediakan newline-nya.

print punya argumen file, cara mudah untuk menulis tanpa menambahkan newline secara manual:

with open("log.txt", "w") as f:
    print("started", file=f)
    print("finished", file=f)

Setiap print menulis argumennya ditambah newline di akhir. Untuk output santai, sering kali inilah bentuk yang paling enak.

Mode teks vs biner

Secara default, open memakai mode teks. Python mengubah byte menjadi string (dengan UTF-8 secara default di platform modern) dan menangani penerjemahan newline.

Untuk gambar, PDF, file hasil kompilasi, atau apa pun yang bukan teks, buka dalam mode biner dengan menambahkan "b" ke mode:

with open("image.png", "rb") as f:
    data = f.read()

print(len(data))  # number of bytes

with open("image_copy.png", "wb") as f:
    f.write(data)

Di mode biner, kamu mendapat objek bytes, bukan str, dan Python tidak menyentuh akhir baris.

Menentukan encoding

Untuk file teks, tulis encoding-nya secara eksplisit. Di 2026, UTF-8 hampir selalu benar:

with open("notes.txt", encoding="utf-8") as f:
    contents = f.read()

Kalau kamu berurusan dengan file lama dari lingkungan yang hanya memakai Windows, kamu mungkin juga melihat cp1252 atau latin-1. Salah menebak akan menghasilkan karakter yang kacau atau UnicodeDecodeError.

pathlib: cara modern menangani path

Modul pathlib di standard library memberimu API yang lebih nyaman daripada string mentah:

from pathlib import Path

path = Path("notes.txt")

# Simple read and write.
contents = path.read_text(encoding="utf-8")
path.write_text("new contents\n", encoding="utf-8")

# Build paths without worrying about / vs \.
data_dir = Path("data")
log_path = data_dir / "today.log"

print(log_path)
print(log_path.exists())
print(log_path.suffix)       # ".log"
print(log_path.stem)         # "today"
print(log_path.parent)       # "data"

Path.read_text() dan write_text() adalah jalan pintas untuk pola with open(...) as f saat kamu hanya ingin membaca dan menulis sekaligus. Untuk iterasi baris per baris, kamu tetap memakai open atau path.open().

Contoh kecil dari awal sampai akhir

Membaca daftar item dari sebuah file, menyaringnya, lalu menulis hasilnya ke file lain:

from pathlib import Path

source = Path("items.txt")
destination = Path("filtered.txt")

items = source.read_text().splitlines()
kept = [item for item in items if item and not item.startswith("#")]

destination.write_text("\n".join(kept) + "\n")

print(f"Kept {len(kept)} items out of {len(items)}")

splitlines() adalah pasangan join yang berorientasi baris. Ia memecah pada karakter newline tanpa menyimpannya, praktis kalau kamu memang akan menggabungkan potongannya lagi.

Saat ada yang salah

Membuka file yang tidak ada memunculkan FileNotFoundError. Mencoba membaca file yang tidak boleh kamu akses memunculkan PermissionError. Keduanya adalah subclass dari OSError, yang juga merupakan subclass dari Exception. Kita akan membahas cara menangani exception dengan benar di halaman berikutnya.

Untuk sekarang, ini sekilas gambaran penanganan error:

from pathlib import Path

path = Path("maybe.txt")

try:
    contents = path.read_text()
except FileNotFoundError:
    print("File doesn't exist - starting fresh.")
    contents = ""

print(repr(contents))

Kebiasaan penting

  • Selalu pakai with open(...), bukan open mentah ditambah menutup manual.
  • Selalu berikan encoding= untuk file teks; UTF-8 secara default.
  • Lakukan iterasi baris per baris untuk file besar; jangan .read() seluruhnya.
  • Untuk path dan pola baca/tulis yang umum, pakai pathlib, yang akan menghemat banyak akrobat string.

Pertanyaan yang sering diajukan

Bagaimana cara membaca file di Python?

Pakai open() dengan pernyataan with, yang otomatis menutup file setelah selesai. with open('file.txt') as f: contents = f.read() membaca seluruh file ke dalam sebuah string. Untuk membaca baris per baris, lakukan perulangan langsung pada objek file: for line in f:.

Apa bedanya mode open 'r', 'w', dan 'a'?

'r' untuk membaca (default). 'w' untuk menulis: membuat file baru atau mengosongkan isinya kalau file sudah ada. 'a' untuk menambah (append): menambahkan ke akhir file tanpa menghapus isinya. Tambahkan 'b' untuk mode biner atau '+' untuk membaca sekaligus menulis.

Kenapa sebaiknya memakai with open, bukan open biasa?

Pernyataan with menjamin file ditutup walaupun terjadi error di tengah jalan. Tanpa with, kamu harus memanggil .close() sendiri dan ingat melakukannya di jalur error. with lebih aman dan kodenya lebih sedikit.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai