Belajar Python File Handling

file handling memungkinkan program menyimpan dan membaca data dari file di komputer. ini penting untuk log, konfigurasi, dan penyimpanan data. konsep ini juga pengembangan dari module dan package Python, karena file sering dipakai nyimpen data yang diproses oleh module itu.
salah satu program pertama yang benar-benya berguna bagi saya adalah script python yang baca file log lalu rangkum errornya, dan itu cuma butuh open(), read(), dan write(). sejak pengalaman itu, file handling jadi salah satu kemampuan yang selalu saya seretkin ke setiap project.
1. Membuka File dengan open()
python punya built-in function open() khusus buat nyentuh file. dia butuh setidaknya nama file dan mode aksesnya:
file = open("data.txt", "r") # r = read (baca)
Mode File
pilih mode sesuai kebutuhan. salah pilih mode sering bikin data hilang tanpa sedikit pun ada peringatan:
| Mode | Fungsi | Bikin file baru? | Timpa isi lama? |
|---|---|---|---|
"r" | Read (baca), default | Tidak, error kalau tidak ada | Tidak |
"w" | Write (tulis), timpa file | Ya | Ya, dikosongkan dulu |
"a" | Append (tambah di akhir) | Ya | Tidak, nambah di akhir |
"x" | Exclusive create, gagal kalau sudah ada | Ya, tapi error kalau sudah ada | Tidak |
"r+" | Read + Write | Tidak | Tidak (tulis timpa posisi kursor) |
"w+" | Write + Read | Ya | Ya |
"a+" | Append + Read | Ya | Tidak |
"rb" / "wb" | Read/Write binary (baca bytes, bukan str) | Sesuai huruf depannya | Sesuai huruf depannya |
kalau kalian mau bikin file baru tapi tidak mau nimpa yang lama tanpa sengaja, pakai
"x"lebih aman daripada"w"."w"diam-diam mengosongkan file lama.
2. Membaca File
dua cara umum baca file, dan keduanya butuh diingat untuk nutup file setelah selesai:
# Baca seluruh file (cocok file kecil, hati-hati kalau file gede)
file = open("data.txt", "r", encoding="utf-8")
isi = file.read()
file.close()
print(isi)
# Baca baris per baris (hemat memori untuk file besar)
file = open("data.txt", "r", encoding="utf-8")
for baris in file:
print(baris.strip())
file.close()
file.read() baca semua sekaligus, enak tapi kalau file ratusan MB bisa bikin memori jebol. for baris in file baca satu baris tiap iterasi jadi lebih irit. ada juga readline() buat satu baris dan readlines() yang balikin list semua baris, tapi untuk file besar hindari readlines() karena sama aja load semua ke memori.
3. with Statement (Rekomendasi)
with otomatis nutup file setelah block selesai, jadi kalian nggak perlu panggil close() manual, ini cara teraman dan non-negotiable di codebase modern:
# Baca file
with open("data.txt", "r", encoding="utf-8") as file:
isi = file.read()
print(isi)
# File otomatis tertutup di sini, bahkan kalau error di dalam block
# Tulis file
with open("output.txt", "w", encoding="utf-8") as file:
file.write("Halo Dunia!\n")
file.write("Baris kedua\n")
tip praktik: kalau kodenya error tengah jalan,
withtetap nutup file dengan benar. kalau pakaiopen()biasa, error bisa bikin file kekunci di Windows sampai proses kelar, atau buffer belum ke-flush jadi file setengah jadi. di review code,with openlangsung kelihatan lifetime resource-nya jelas.
4. Menulis dan Append
beda mode, beda efeknya:
# Write, timpa isi file lama
with open("catatan.txt", "w", encoding="utf-8") as f:
f.write("Catatan baru\n")
# Append, tambah di akhir (bisa bikin file baru kalau belum ada)
with open("log.txt", "a", encoding="utf-8") as f:
f.write("2026-08-01: Aplikasi dijalankan\n")
write() nggak nambah newline otomatis, jadi simpan \n di akhir tiap baris kalo butuh. dan pakai encoding="utf-8" biar huruf indonesia aman.
5. Baca CSV Sederhana
CSV itu teks biasa dipisah koma, jadi bisa dibaca pakai split():
with open("nilai.csv", "r", encoding="utf-8") as f:
for baris in f:
kolom = baris.strip().split(",")
nama, nilai = kolom[0], kolom[1]
print(f"{nama}: {nilai}")
ini cukup buat CSV sederhana. kalau mau baca CSV yang punya field berisi koma atau kutip, pakai module bawaan csv lebih aman, dan ingat newline="" biar tidak muncul baris kosong di Windows:
import csv
with open("nilai.csv", "r", encoding="utf-8", newline="") as f:
reader = csv.reader(f)
for nama, nilai in reader:
print(f"{nama}: {nilai}")
# Tulis CSV yang benar
with open("nilai_baru.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["nama", "nilai"])
writer.writerow(["Andi", "90"])
6. Error Handling
lalu, jangan lupa tangani error, soalnya file gak ada atau permission blocked itu hal yang lumrah. di Python 3, IOError itu cuma alias dari OSError, jadi tangkap yang spesifik dulu:
try:
with open("file_tidak_ada.txt", "r", encoding="utf-8") as f:
print(f.read())
except FileNotFoundError:
print("File tidak ditemukan!")
except PermissionError:
print("Tidak punya izin akses file")
except IsADirectoryError:
print("Itu folder, bukan file")
except UnicodeDecodeError:
print("Encoding salah, coba utf-8 atau latin-1")
except OSError as e:
print(f"Error OS lain: {e}")
urutan except penting, FileNotFoundError dan PermissionError itu subclass dari OSError, jadi taruh OSError paling bawah sebagai jaring pengaman. kalau kalian tangkap OSError duluan, yang spesifik tidak akan pernah kena.
7. Cek File Sebelum Baca
biasanya sebelum open(), dicek dulu apakah file benar-benar ada, soalnya error bikin program berhenti:
import os
if os.path.exists("data.txt"):
with open("data.txt", "r", encoding="utf-8") as f:
print(f.read())
else:
print("File tidak ditemukan")
os.path yang punya function exists(), getsize(), isfile(), juga berguna. kalau kalian lebih suka gaya modern, pathlib juga punya Path.exists() yang sama.
tapi hati-hati, cek dulu baru buka itu ada celah race condition: file bisa kehapus di jeda antara exists() dan open(). untuk skrip yang robust, try/except FileNotFoundError lebih aman daripada if exists. pakai exists() kalau cuma buat nampilin info, pakai try kalau mau aksi beneran.
from pathlib import Path
p = Path("data.txt")
# untuk info
if p.is_file():
print("siap dibaca")
# untuk aksi, tetap bungkus try
try:
text = p.read_text(encoding="utf-8")
except FileNotFoundError:
print("file hilang di tengah jalan")
8. Studi Kasus: Ringkasan Log Error
kombinasi semua di atas biasanya dipakai buat processing otomatis, seperti rangkuman error dari file log:
from datetime import datetime
with open("app.log", "r") as f:
error_count = 0
for baris in f:
if "ERROR" in baris:
error_count += 1
# Tulis laporan ringkasan ke file baru
with open("laporan.txt", "w", encoding="utf-8") as f:
f.write(f"Tanggal: {datetime.now()}\n")
f.write(f"Total error: {error_count}\n")
print(f"Selesai! ditemukan {error_count} error")
9. Menggunakan pathlib (Gaya Modern)
di proyek modern, pathlib sering disukai ketimbang os.path karena lebih OOP dan ngegabungin semua di satu class Path. contohnya read_text() dan write_text() yang langsung baca/tulis tanpa perlu open() manual:
from pathlib import Path
# cek keberadaan file
path = Path("data.txt")
if path.exists():
print("file ada")
else:
print("file belum ada")
# baca seluruh isi teks sekaligus
text = Path("data.txt").read_text(encoding="utf-8")
print(text)
# tulis langsung, otomatis ciptakan kalau belum ada, bikin folder induk jika perlu
Path("output").mkdir(parents=True, exist_ok=True)
Path("output/hasil.txt").write_text("hello dunia\n", encoding="utf-8")
Path punya method read_text(), write_text(), exists(), open(), iterdir(), glob(), parent, name, suffix, dan masih banyak lagi, jadi lebih rapi ketimbang ngabungin os.path.exists() + open() di dua baris terpisah. kalau project kalian baru, pathlib adalah pilihan yang direkomendasikan sejak python 3.4, dan gak perlu install package tambahan. pathlib juga otomatis ngurus backslash Windows, jadi path Path("logs") / "app.log" jalan di semua OS.
from pathlib import Path
# gabung path pakai operator /
base = Path.cwd() / "data" / "nilai.csv"
print(base) # /home/user/data/nilai.csv atau C:\user\data\nilai.csv
# cari semua csv
for p in Path("data").glob("*.csv"):
print(p.name)
# baca file besar tetap pakai open biar streaming
with Path("app.log").open("r", encoding="utf-8") as f:
for baris in f:
if "ERROR" in baris:
print(baris)
pro tip:
Path.read_text()danwrite_text()otomatis nutup file, jadi aman, tapi untuk file besar mending pakePath.open()biar nggak load semua ke memori sekaligus. dan selalu setencoding="utf-8"eksplisit, kalau tidak Python pakai default locale yang beda di tiap mesin dan bikin bug encoding susah dilacak.
Kesimpulan
open()buat buka file, pilih moderbaca,wtulis,atambah,xbikin baru yang anti timpawith open(..., encoding="utf-8")otomatis nutup file, aman bahkan kalau error, jangan pakaiopentanpawithkecuali ada alasan kuat- selalu tangani error pakai try-except dengan urutan spesifik
FileNotFoundError,PermissionError,IsADirectoryError, baruOSError - pakai
encoding="utf-8"eksplisit biar huruf indonesia nggak rusak, untuk CSV tambahnewline="" - cek
os.path.exists()atauPath.exists()cuma untuk info, untuk aksi pakaitrybiar bebas race condition - untuk CSV simpel pakai
split(",")cukup, yang kompleks pakai modulecsvdengannewline="" - pakai
pathlib.Pathuntuk project baru, methodnyaread_text,write_text,exists,glob,mkdir(parents=True)semua di satu tempat
Baca Juga Mengenai :
Pertanyaan yang Sering Diajukan
Apa itu file handling di Python
file handling di python ini kemampuan buat baca dan tulis file di komputer pakai modul built-in seperti open, os, dan pathlib. dipake buat nyimpen log, konfigurasi, data csv, atau file teks.
Apa perbedaan mode r, w, dan a
r berarti read (baca), mode default, kalau file gak ada langsung error. w berarti write (tulis), timpa isi file lama, kalau belum ada langsung dibuat. a berarti append (tambah), nulis di akhir file tanpa menghapus isi lama.
Kenapa harus pakai with open, apa bahayanya
with open otomatis nutup file setelah keluar block. kalau pakai open biasa dan lupa panggil close(), file bisa macet atau data numpuk di buffer, apalagi kalo error tengah jalan.
Apa gunanya encoding utf-8
utf-8 itu standar penyimpanan karakter yang dukung huruf latin, angka, emoji, hingga bahasa indonesia. pakai utf-8 cegah error karakter aneh waktu baca atau tulis file.
Cara cek file ada sebelum dibaca
pakai os.path.exists(nama_file) atau pathlib Path(nama_file).exists(), yang keduanya balikin True atau False.
Harus pakai module csv untuk baca CSV
tidak wajib, kalau format sederhana bisa pakai with open lalu split koma. tapi kalau CSV-nya kompleks karena ada koma di dalam field, pakai module csv yang built-in justru lebih aman.
Apa bedanya os.path dan pathlib
os.path itu style lama, function-based, dan path-nya string. pathlib (sejak python 3.4) pakai Path object yang punya method read_text, write_text, exists, dll. keduanya kerja, tapi pathlib lebih rapi dan direkomendasikan buat project baru.

