Ada satu masalah besar yang mungkin belum kamu sadari dari semua program yang kita buat selama ini: semua data hilang begitu program ditutup.
Kamu menginput nilai 32 siswa dengan susah payah — lalu program ditutup — dan data itu lenyap selamanya. Besok kamu harus input ulang dari awal. Tidak praktis sama sekali.
Inilah yang akan kita selesaikan di artikel ini. Kita akan belajar cara Python membaca dan menulis file — sehingga data yang kita simpan bisa bertahan permanen di hard disk, dibuka kapanpun dibutuhkan, bahkan bisa langsung dilihat di Notepad atau Microsoft Excel.
Kenapa File Itu Penting?
Bayangkan skenario ini: Bu Halimah wali kelas X IPS 2 baru saja selesai menginput nilai 36 siswa ke program Python. Programnya berjalan sempurna — tampil semua dengan rapi. Tapi kemudian listrik padam. Program tertutup paksa. Semua data yang baru saja diinput hilang total karena hanya tersimpan di RAM.
Dengan file, skenario ini tidak akan terjadi. Data ditulis ke hard disk, dan hard disk menyimpan data meski listrik mati sekalipun.
Konsep Dasar: Program ↔ File
Sebelum ke kode, pahami dulu konsep dasarnya:

Saat kamu bekerja dengan file di Python, ada tiga operasi utama:
| Mode | Simbol | Fungsi | Catatan |
|---|---|---|---|
| Write | "w" | Tulis/buat file baru | ⚠️ Menimpa file lama jika ada |
| Read | "r" | Baca isi file | File harus sudah ada |
| Append | "a" | Tambah di akhir file | Tidak menghapus isi lama |
Menulis File — Simpan Data ke Disk
Cara paling umum membuka file di Python adalah menggunakan with open() — disebut juga context manager. Kelebihannya: file otomatis ditutup dengan benar setelah selesai dipakai, meski terjadi error di tengah jalan.
# Menulis file teks sederhana
with open("nilai_siswa.txt", "w") as file:
file.write("Nama: Andi Saputra\n")
file.write("Nilai: 85.5\n")
file.write("Status: Lulus\n")
print("Data berhasil disimpan!")
Setelah kode ini dijalankan, akan muncul file baru bernama nilai_siswa.txt di folder yang sama dengan programmu. Coba buka di Notepad — isinya persis seperti yang kamu tulis!
💡
\nadalah karakter baris baru. Tanpanya, semua teks akan ditulis dalam satu baris panjang yang tidak terbaca. Selalu tambahkan\ndi akhir setiap baris yang ingin dipisah.
Menulis Banyak Baris Sekaligus
Kalau kamu punya banyak baris, gunakan writelines() dengan list:
nama_siswa = ["Andi Saputra", "Budi Santoso", "Citra Dewi", "Deni Pratama"]
with open("daftar_siswa.txt", "w") as file:
for i, nama in enumerate(nama_siswa, start=1):
file.write(f"{i}. {nama}\n")
print(f"✅ {len(nama_siswa)} nama berhasil disimpan ke daftar_siswa.txt")
Hasil file daftar_siswa.txt:
1. Andi Saputra
2. Budi Santoso
3. Citra Dewi
4. Deni Pratama
Membaca File — Ambil Data dari Disk
Ada tiga cara membaca file, masing-masing cocok untuk situasi berbeda:
# CARA 1: read() — baca semua sekaligus jadi satu string
with open("daftar_siswa.txt", "r") as file:
semua_isi = file.read()
print(semua_isi)
# CARA 2: readlines() — baca semua, simpan sebagai list baris
with open("daftar_siswa.txt", "r") as file:
daftar_baris = file.readlines()
for baris in daftar_baris:
print(baris.strip()) # .strip() hapus \n di akhir baris
# CARA 3: Iterasi langsung — paling efisien untuk file besar
with open("daftar_siswa.txt", "r") as file:
for baris in file:
print(baris.strip())
Untuk file kecil (data kelas), ketiga cara sama baiknya. Untuk file sangat besar (data seluruh sekolah), Cara 3 lebih hemat memori karena membaca satu baris setiap kali, bukan langsung semuanya.
Menangani File yang Belum Ada
Kalau kamu mencoba membaca file yang belum ada, Python akan langsung error FileNotFoundError. Selalu tambahkan penanganan error:
nama_file = "nilai_siswa.txt"
try:
with open(nama_file, "r") as file:
isi = file.read()
print(isi)
except FileNotFoundError:
print(f"❌ File '{nama_file}' tidak ditemukan.")
print(" Pastikan nama file sudah benar dan ada di folder yang sama.")
Kita akan belajar try-except lebih dalam di artikel berikutnya — tapi pola ini penting untuk dipakai sekarang agar program tidak crash saat file tidak ada.
Mode Append — Tambah Tanpa Hapus
Mode "a" (append) sangat berguna untuk data yang terus bertambah, seperti log absensi harian. Setiap kali program dijalankan, data baru ditambahkan di akhir file — tidak pernah menghapus yang sudah ada.

from datetime import date
def catat_kehadiran(nama_siswa_hadir):
"""Tambahkan data kehadiran hari ini ke file log."""
hari_ini = date.today()
with open("log_absensi.txt", "a") as file:
file.write(f"\n=== Tanggal: {hari_ini} ===\n")
for nama in nama_siswa_hadir:
file.write(f"{nama},HADIR\n")
print(f"✅ Absensi {hari_ini} berhasil dicatat ({len(nama_siswa_hadir)} siswa hadir)")
# Jalankan tiap hari dengan data yang berbeda
hadir_hari_ini = ["Andi Saputra", "Citra Dewi", "Eka Fitriani"]
catat_kehadiran(hadir_hari_ini)
Setiap kali program dijalankan di hari berbeda, isi file semakin bertambah. Setelah seminggu, file log_absensi.txt akan berisi rekap kehadiran lengkap seluruh minggu.
Format CSV — Data yang Bisa Dibuka di Excel
Sejauh ini kita menyimpan teks biasa. Untuk data terstruktur seperti nilai siswa, format CSV (Comma-Separated Values) jauh lebih baik karena:
- Bisa langsung dibuka di Microsoft Excel atau Google Sheets
- Format standar yang dimengerti banyak aplikasi
- Mudah dibaca dan ditulis secara otomatis oleh Python

Menulis CSV
import csv
# Data nilai siswa
data_nilai = [
["nama", "tugas", "uts", "uas"], # baris header
["Andi", 80, 85, 90],
["Budi", 72, 68, 75],
["Citra", 91, 88, 95],
["Deni", 65, 70, 68],
]
with open("nilai_siswa.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerows(data_nilai)
print("✅ Data nilai disimpan ke nilai_siswa.csv — bisa dibuka di Excel!")
💡
newline=""padaopen()perlu ditambahkan saat menulis CSV di Windows, untuk menghindari baris kosong ganda yang muncul di Excel.
Membaca CSV dengan DictReader
csv.DictReader adalah cara paling nyaman membaca CSV — setiap baris otomatis jadi dictionary dengan key dari baris pertama (header):
import csv
with open("nilai_siswa.csv", "r") as file:
reader = csv.DictReader(file)
print(f"{'Nama':<12} {'Tugas':>6} {'UTS':>6} {'UAS':>6} {'Akhir':>7} {'Status'}")
print("-" * 50)
for row in reader:
nama = row["nama"]
tugas = float(row["tugas"])
uts = float(row["uts"])
uas = float(row["uas"])
nilai_akhir = (tugas * 0.30) + (uts * 0.35) + (uas * 0.35)
status = "Lulus ✅" if nilai_akhir >= 75 else "Remedi ⚠️"
print(f"{nama:<12} {tugas:>6.0f} {uts:>6.0f} {uas:>6.0f} {nilai_akhir:>7.2f} {status}")
Output:
Nama Tugas UTS UAS Akhir Status
--------------------------------------------------
Andi 80 85 90 85.25 Lulus ✅
Budi 72 68 75 71.80 Remedi ⚠️
Citra 91 88 95 91.23 Lulus ✅
Deni 65 70 68 67.55 Remedi ⚠️
⚠️ Perhatikan: Data dari CSV selalu berupa string! Angka
"80"bukan sama dengan angka80. Selalu konversi denganfloat()atauint()sebelum melakukan kalkulasi.
Studi Kasus: Sistem Nilai Permanen
Sekarang kita gabungkan semua yang sudah dipelajari — fungsi (artikel #8) dan file — untuk membuat sistem nilai yang datanya benar-benar tersimpan permanen.
Bu Halimah akhirnya tidak perlu khawatir listrik padam lagi!
# ============================================================
# Sistem Nilai Permanen — Bu Halimah, Wali Kelas X IPS 2
# Data tersimpan ke CSV, bisa dibuka lagi kapanpun
# ============================================================
import csv
import os
from datetime import date
NAMA_FILE = "nilai_x_ips2.csv"
HEADER = ["nis", "nama", "tugas", "uts", "uas", "nilai_akhir", "predikat", "tanggal_input"]
# ── Fungsi-Fungsi Pendukung ──────────────────────────────────
def hitung_nilai_akhir(tugas, uts, uas):
return round((tugas * 0.30) + (uts * 0.35) + (uas * 0.35), 2)
def tentukan_predikat(nilai):
if nilai >= 90: return "A"
elif nilai >= 80: return "B"
elif nilai >= 70: return "C"
elif nilai >= 60: return "D"
else: return "E"
def inisialisasi_file():
"""Buat file CSV baru dengan header jika belum ada."""
if not os.path.exists(NAMA_FILE):
with open(NAMA_FILE, "w", newline="") as f:
csv.writer(f).writerow(HEADER)
print(f"📄 File '{NAMA_FILE}' berhasil dibuat.")
def simpan_nilai_siswa(data_siswa):
"""Tambahkan satu baris data siswa ke CSV."""
with open(NAMA_FILE, "a", newline="") as f:
csv.writer(f).writerow(data_siswa)
def baca_semua_nilai():
"""Baca dan kembalikan semua data dari CSV."""
try:
with open(NAMA_FILE, "r") as f:
return list(csv.DictReader(f))
except FileNotFoundError:
return []
def tampilkan_semua_nilai():
"""Tampilkan semua data nilai dalam format tabel."""
data = baca_semua_nilai()
if not data:
print("⚠️ Belum ada data nilai tersimpan.")
return
print(f"\n{'='*70}")
print(f"{'REKAP NILAI KELAS X IPS 2 — SMK Nusantara':^70}")
print(f"{'='*70}")
print(f" {'NIS':<10} {'Nama':<20} {'Tugas':>5} {'UTS':>5} {'UAS':>5} {'Akhir':>6} {'Pred':>4}")
print(f" {'-'*64}")
for row in data:
print(f" {row['nis']:<10} {row['nama']:<20} "
f"{float(row['tugas']):>5.0f} {float(row['uts']):>5.0f} "
f"{float(row['uas']):>5.0f} {float(row['nilai_akhir']):>6.2f} "
f"{row['predikat']:>4}")
semua_akhir = [float(r["nilai_akhir"]) for r in data]
rata = sum(semua_akhir) / len(semua_akhir)
lulus = sum(1 for n in semua_akhir if n >= 75)
print(f" {'='*64}")
print(f" Total: {len(data)} siswa | Rata-rata: {rata:.2f} | Lulus: {lulus} | Remedi: {len(data)-lulus}")
print(f"{'='*70}")
def input_nilai_siswa():
"""Input dan simpan data nilai siswa baru."""
print("\n--- Input Nilai Siswa Baru ---")
nis = input("NIS : ").strip()
nama = input("Nama : ").strip().title()
def input_nilai(label):
while True:
try:
n = float(input(f"{label} (0-100): "))
if 0 <= n <= 100: return n
print(" ❌ Nilai harus 0-100!")
except ValueError:
print(" ❌ Masukkan angka!")
tugas = input_nilai("Nilai Tugas")
uts = input_nilai("Nilai UTS ")
uas = input_nilai("Nilai UAS ")
nilai_akhir = hitung_nilai_akhir(tugas, uts, uas)
predikat = tentukan_predikat(nilai_akhir)
tgl_input = date.today()
data_baris = [nis, nama, tugas, uts, uas, nilai_akhir, predikat, tgl_input]
simpan_nilai_siswa(data_baris)
print(f"\n✅ Data {nama} berhasil disimpan!")
print(f" Nilai akhir: {nilai_akhir} | Predikat: {predikat}")
# ── Program Utama ─────────────────────────────────────────────
inisialisasi_file()
print("╔══════════════════════════════════════════╗")
print("║ SISTEM NILAI PERMANEN — BU HALIMAH ║")
print("║ Kelas X IPS 2 — SMK Nusantara 2025 ║")
print("╚══════════════════════════════════════════╝")
while True:
print("\n[1] Input nilai siswa baru")
print("[2] Tampilkan semua nilai")
print("[3] Keluar")
pilihan = input("\nPilih menu [1-3]: ").strip()
if pilihan == "1":
input_nilai_siswa()
elif pilihan == "2":
tampilkan_semua_nilai()
elif pilihan == "3":
print(f"\n✅ Data tersimpan aman di '{NAMA_FILE}'. Sampai jumpa!")
break
else:
print("❌ Pilihan tidak valid.")
Program ini menggabungkan hampir semua yang sudah kita pelajari:
- Fungsi dari artikel #8 — setiap tugas punya fungsinya sendiri
- Dictionary dari artikel #7 —
DictReadermemberi akses data dengan nama kolom - List dari artikel #6 — kumpulkan semua nilai untuk hitung rata-rata
- If-elif-else dari artikel #4 — penentu predikat
- Loop while dari artikel #5 — menu terus tampil sampai pilih keluar
- File CSV — inti artikel ini, data tersimpan permanen
Dan yang paling penting: setiap kali program ini dijalankan ulang, data dari sesi sebelumnya masih ada di file CSV. Bu Halimah bisa input hari ini, besok buka program lagi, dan data kemarin masih utuh.
Tips Praktis File di Python
1. Selalu pakai with open() Pola with open() as f: memastikan file selalu ditutup dengan benar, bahkan kalau terjadi error. Ini mencegah korupsi data dan file yang “terkunci”.
2. Gunakan os.path.exists() sebelum baca
import os
if os.path.exists("data.txt"):
# aman untuk dibaca
else:
# buat file baru atau tampilkan pesan
3. Simpan di folder yang jelas Kalau mau simpan di folder tertentu, sertakan path-nya:
open("data/nilai/kelas_x.csv", "w") # simpan di subfolder data/nilai/
4. Format penamaan file yang baik Pakai nama yang deskriptif dan tambahkan tanggal kalau perlu:
from datetime import date
nama_file = f"nilai_semester_{date.today().year}.csv"
Latihan: Buku Nilai Harian Sederhana
Buat file buku_nilai_harian.py. Program ini menyimpan nilai ulangan harian ke file teks, dan bisa menampilkan rekap kapanpun:
# ==========================================
# Buku Nilai Harian Sederhana
# ==========================================
import os
from datetime import date
NAMA_FILE = "nilai_harian.txt"
def catat_nilai(mapel, nama, nilai):
"""Simpan satu nilai ulangan ke file."""
with open(NAMA_FILE, "a") as f:
f.write(f"{date.today()}|{mapel}|{nama}|{nilai}\n")
def tampilkan_rekap(filter_mapel=None):
"""Tampilkan rekap nilai dari file."""
if not os.path.exists(NAMA_FILE):
print("Belum ada data nilai.")
return
print(f"\n{'Tanggal':<12} {'Mapel':<15} {'Nama':<20} {'Nilai':>6}")
print("-" * 55)
with open(NAMA_FILE, "r") as f:
for baris in f:
tgl, mapel, nama, nilai = baris.strip().split("|")
if filter_mapel and mapel != filter_mapel:
continue
print(f"{tgl:<12} {mapel:<15} {nama:<20} {float(nilai):>6.1f}")
# ── Program ──
print("=== BUKU NILAI HARIAN ===")
while True:
print("\n[1] Catat nilai baru [2] Lihat semua [3] Filter per mapel [4] Keluar")
pilihan = input("Pilih: ").strip()
if pilihan == "1":
m = input("Mata pelajaran : ")
n = input("Nama siswa : ").title()
v = float(input("Nilai : "))
catat_nilai(m, n, v)
print("✅ Tersimpan!")
elif pilihan == "2":
tampilkan_rekap()
elif pilihan == "3":
m = input("Filter mapel: ")
tampilkan_rekap(filter_mapel=m)
elif pilihan == "4":
print("Data aman tersimpan. Sampai jumpa!")
break
Coba jalankan program ini beberapa kali, input data berbeda setiap kali. Perhatikan bahwa data terus bertambah — tidak pernah hilang meski program ditutup dan dibuka lagi!
Rangkuman
| Konsep | Sintaks | Catatan |
|---|---|---|
| Buka file | with open("file.txt", mode) as f: | Selalu pakai with |
| Tulis baru | mode="w" | ⚠️ Timpa file lama |
| Baca | mode="r" | File harus ada |
| Tambah | mode="a" | Tidak hapus isi lama |
| Tulis baris | f.write("teks\n") | Jangan lupa \n |
| Baca semua | f.read() | Satu string panjang |
| Baca per baris | f.readlines() | List of strings |
| Iterasi baris | for baris in f: | Hemat memori |
| Hapus spasi | .strip() | Wajib saat baca baris |
| Tulis CSV | csv.writer(f).writerow(data) | Perlu import csv |
| Baca CSV | csv.DictReader(f) | Otomatis jadi dict |
| Cek file ada | os.path.exists("file") | Perlu import os |
Artikel Selanjutnya
Di artikel berikutnya kita belajar Error Handling — cara membuat program yang tidak langsung crash saat terjadi kesalahan. Bayangkan guru yang salah ketik huruf saat input nilai — program kita harus bisa menanganinya dengan baik, bukan langsung berhenti total!
Ada pertanyaan soal file, CSV, atau cara menyimpan data? Tulis di komentar! 💬
Artikel ini merupakan bagian dari seri “Belajar Python untuk Sekolah” — panduan coding Python bergaya santai untuk pelajar SMA/SMK/MA Indonesia.
Tinggalkan Balasan