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.
Menulis file
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. Kalauoutput.txtsudah ada, isinya langsung hilang begituopenberjalan.- 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 ke file
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(...), bukanopenmentah 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.