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 denganos.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()dansimpan_data()menghubungkan program dengan file JSONos.path.exists()mencegah error saat file belum adaJSONDecodeErrorditangani agar program tetap jalan meski file rusak- Pencarian dan filter dibuat ringkas dengan list comprehension
withmenjamin 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.
