Langsung ke konten

Proyek 3: Program Manajemen Data Siswa di Python

Manajemen data adalah proyek terakhir seri ini. Artikel ini memandu membuat aplikasi data siswa dengan dictionary, pencarian, filter, dan penyimpanan JSON.

Belajar Python Level Basic
Belajar Python Level Basic
Advertisement

Artikel ini bagian dari seri Belajar Python Level Basic di hanifmu.com. Di artikel sebelumnya kita sudah menyelesaikan Proyek 2: Program To-Do List. Sekarang kita buat program yang datanya tetap ada setelah ditutup.

Dua proyek sebelumnya melupakan semua datanya begitu program berhenti. Proyek terakhir ini menggabungkan hampir semua bekal yang sudah kamu pelajari: struktur data, function, loop, penanganan error, dan penyimpanan file.

Apa yang Akan Dibuat

Program manajemen data siswa dengan fitur:

  • Menambah data siswa berisi nama dan nilai.
  • Menampilkan seluruh data.
  • Mencari siswa berdasarkan potongan nama.
  • Memfilter siswa yang sudah lulus.
  • Menghapus data berdasarkan nama.
  • Menyimpan semua perubahan ke file JSON secara otomatis.

Struktur Data Dictionary

Setiap siswa diwakili satu dictionary:

{"nama": "Budi", "nilai": 85}

Seluruh data disimpan dalam list:

data = [
    {"nama": "Budi", "nilai": 85},
    {"nama": "Sari", "nilai": 92},
]

Struktur ini mudah disimpan sebagai JSON dan mudah difilter dengan list comprehension.

Memuat dan Menyimpan Data

Dua function ini menjadi pintu masuk dan keluar data ke file:

import json
import os

FILE_DATA = "data_siswa.json"


def muat_data():
    if not os.path.exists(FILE_DATA):
        return []

    try:
        with open(FILE_DATA, "r", encoding="utf-8") as file:
            return json.load(file)
    except json.JSONDecodeError:
        print("File data rusak, memulai dari daftar kosong.")
        return []


def simpan_data(data):
    with open(FILE_DATA, "w", encoding="utf-8") as file:
        json.dump(data, file, indent=2, ensure_ascii=False)

muat_data() memeriksa dulu apakah file sudah ada. Kalau belum, ia mengembalikan list kosong. Kalau isinya rusak, JSONDecodeError ditangkap agar program tidak berhenti.

simpan_data() memakai with sehingga file selalu tertutup, dan ensure_ascii=False menjaga nama berkarakter khusus tetap terbaca.

Menambah dan Menghapus Data

def tambah_siswa(data, nama, nilai):
    data.append({"nama": nama, "nilai": nilai})
    simpan_data(data)


def hapus_siswa(data, nama):
    for i, s in enumerate(data):
        if s["nama"].lower() == nama.lower():
            data.pop(i)
            simpan_data(data)
            return True
    return False

tambah_siswa() menyimpan perubahan langsung, jadi data tidak hilang kalau program ditutup mendadak. hapus_siswa() mencari nama tanpa membedakan huruf besar-kecil, lalu mengembalikan True bila berhasil.

Mencari dan Memfilter Data

List comprehension membuat kedua operasi ini singkat:

def cari_siswa(data, kata):
    kata = kata.lower()
    return [s for s in data if kata in s["nama"].lower()]


def filter_lulus(data, batas=75):
    return [s for s in data if s["nilai"] >= batas]

cari_siswa() mencocokkan potongan nama, sehingga mengetik "bu" tetap menemukan "Budi". filter_lulus() menyaring siswa dengan nilai di atas batas kelulusan.

Menampilkan hasilnya diberi status agar mudah dibaca:

def tampilkan(daftar):
    if not daftar:
        print("Tidak ada data.")
        return

    for s in daftar:
        status = "Lulus" if s["nilai"] >= 75 else "Belum lulus"
        print(f"- {s['nama']}: {s['nilai']} ({status})")

Kode Lengkap

Simpan sebagai manajemen_data.py:

# manajemen_data.py

import json
import os

FILE_DATA = "data_siswa.json"


def muat_data():
    if not os.path.exists(FILE_DATA):
        return []

    try:
        with open(FILE_DATA, "r", encoding="utf-8") as file:
            return json.load(file)
    except json.JSONDecodeError:
        print("File data rusak, memulai dari daftar kosong.")
        return []


def simpan_data(data):
    with open(FILE_DATA, "w", encoding="utf-8") as file:
        json.dump(data, file, indent=2, ensure_ascii=False)


def tambah_siswa(data, nama, nilai):
    data.append({"nama": nama, "nilai": nilai})
    simpan_data(data)


def cari_siswa(data, kata):
    kata = kata.lower()
    return [s for s in data if kata in s["nama"].lower()]


def filter_lulus(data, batas=75):
    return [s for s in data if s["nilai"] >= batas]


def hapus_siswa(data, nama):
    for i, s in enumerate(data):
        if s["nama"].lower() == nama.lower():
            data.pop(i)
            simpan_data(data)
            return True
    return False


def tampilkan(daftar):
    if not daftar:
        print("Tidak ada data.")
        return

    for s in daftar:
        status = "Lulus" if s["nilai"] >= 75 else "Belum lulus"
        print(f"- {s['nama']}: {s['nilai']} ({status})")


def minta_nilai(prompt):
    try:
        return float(input(prompt))
    except ValueError:
        return None


def main():
    data = muat_data()
    print(f"Memuat {len(data)} data.")

    while True:
        print("\n=== Manajemen Data Siswa ===")
        print("1. Tambah data")
        print("2. Tampilkan semua")
        print("3. Cari nama")
        print("4. Filter yang lulus")
        print("5. Hapus data")
        print("6. Keluar")

        pilihan = input("Pilih menu (1-6): ")

        if pilihan == "1":
            nama = input("Nama: ").strip()
            if not nama:
                print("Nama tidak boleh kosong.")
                continue

            nilai = minta_nilai("Nilai: ")
            if nilai is None:
                print("Nilai harus berupa angka.")
                continue

            tambah_siswa(data, nama, nilai)
            print("Data disimpan.")

        elif pilihan == "2":
            tampilkan(data)

        elif pilihan == "3":
            kata = input("Cari nama: ")
            tampilkan(cari_siswa(data, kata))

        elif pilihan == "4":
            tampilkan(filter_lulus(data))

        elif pilihan == "5":
            nama = input("Nama yang dihapus: ")
            if hapus_siswa(data, nama):
                print("Data dihapus.")
            else:
                print("Data tidak ditemukan.")

        elif pilihan == "6":
            print("Data tersimpan. Sampai jumpa!")
            break

        else:
            print("Pilihan tidak tersedia.")


if __name__ == "__main__":
    main()

Contoh Jalannya Program

Memuat 0 data.

=== Manajemen Data Siswa ===
1. Tambah data
2. Tampilkan semua
3. Cari nama
4. Filter yang lulus
5. Hapus data
6. Keluar
Pilih menu (1-6): 1
Nama: Budi
Nilai: 85
Data disimpan.

Pilih menu (1-6): 1
Nama: Sari
Nilai: 68
Data disimpan.

Pilih menu (1-6): 2
- Budi: 85.0 (Lulus)
- Sari: 68.0 (Belum lulus)

Pilih menu (1-6): 4
- Budi: 85.0 (Lulus)

Pilih menu (1-6): 6
Data tersimpan. Sampai jumpa!

Setelah program ditutup, isi data_siswa.json menjadi:

[
  {
    "nama": "Budi",
    "nilai": 85.0
  },
  {
    "nama": "Sari",
    "nilai": 68.0
  }
]

Jalankan lagi, dan data itu langsung dimuat.

Pengembangan Lanjutan

Program ini masih bisa dikembangkan lebih jauh:

  • Menambah kolom seperti kelas, tanggal lahir, atau mata pelajaran.
  • Mengurutkan data berdasarkan nilai memakai sorted() dan lambda.
  • Mengekspor data ke CSV untuk dibuka di spreadsheet.
  • Menambahkan validasi nilai agar berada di rentang 0 sampai 100.

Kesalahan Umum Pemula

  • Menulis data langsung tanpa menyimpan — perubahan hilang saat program ditutup; panggil simpan_data().
  • Tidak menangani file yang belum ada — FileNotFoundError; periksa dengan os.path.exists().
  • Menganggap isi JSON selalu valid — file bisa rusak; tangkap JSONDecodeError.
  • Menghapus item saat mengiterasi list yang sama — lakukan pencarian dulu, baru pop().
  • Membedakan huruf besar-kecil saat mencari — pakai .lower() di kedua sisi.

Ringkasan

  • Data siswa disimpan sebagai list berisi dictionary
  • muat_data() dan simpan_data() menghubungkan program dengan file JSON
  • os.path.exists() mencegah error saat file belum ada
  • JSONDecodeError ditangani agar program tetap jalan meski file rusak
  • Pencarian dan filter dibuat ringkas dengan list comprehension
  • with menjamin file selalu tertutup setelah dipakai

Penutup

Selamat, kamu sudah menyelesaikan seluruh seri Belajar Python Level Basic. Dari program “Hello, World!” sampai aplikasi yang menyimpan datanya sendiri.

Yang paling penting bukan menghafal setiap function, tapi kebiasaan yang sudah kamu bangun: memecah masalah menjadi bagian kecil, menulis kode yang mudah dibaca, menguji dengan input sederhana, dan memperbaiki error dengan tenang.

Langkah berikutnya adalah berlatih. Ubah proyek-proyek ini sesuai kebutuhanmu, buat versi sendiri, lalu lanjutkan ke materi tingkat menengah seperti pemrograman berorientasi objek, module dan package, serta pengujian otomatis.