author Ahmad Muhardian

Belajar Membuat Aplikasi CRUDS dengan Python dan File CSV


Tutorial Membuat Aplikasi CRUDS dengan CSV

Ini adalah lanjutan dari tutorial sebelumnya:

Pada tutorial ini, kita akan belajar membuat aplikasi CRUDS berbasis CLI dengan file CSV sebagai media penyimpanan datanya.

CRUDS merupakan singkatan dari Create, Read, Update, Delete, dan Search.

Kurang lebih, kita akan membuat aplikasi untuk melakukan lima hal tersebut.

Mari langsung saja kita mulai…

Membuat Menu Utama

Pertama kita membutuhkan tampilan utama dari aplikasi ini. Kita ingin menampilkan menu-menu atau fitur yang ada di dalam aplikasi.

Mari kita langsung buat..

Silakan buat program baru bernama app_csv.py, kemudian isi dengan kode berikut:

import csv
import os

csv_filename = 'contacts.csv'

def clear_screen():
    os.system('cls' if os.name == 'nt' else 'clear')

def show_menu():
    clear_screen()
    print("=== APLIKASI KONTAK ===")
    print("[1] Lihat Daftar Kontak")
    print("[2] Buat Kontak Baru")
    print("[3] Edit Kontak")
    print("[4] Hapus Kontak")
    print("[5] Cari Kontak")
    print("[0] Exit")
    print("------------------------")
    selected_menu = input("Pilih menu> ")
    
    if(selected_menu == "1"):
        show_contact()
    elif(selected_menu == "2"):
        create_contact()
    elif(selected_menu == "3"):
        edit_contact()
    elif(selected_menu == "4"):
        delete_contact()
    elif(selected_menu == "5"):
        search_contact()
    elif(selected_menu == "0"):
        exit()
    else:
        print("Kamu memilih menu yang salah!")
        back_to_menu()

def back_to_menu():
    print("\n")
    input("Tekan Enter untuk kembali...")
    show_menu()

Pada kode program tersebut, kita menggunakan dua modul.. yakni: csv dan os.

import csv
import os

Modul csv kita butuhkan untuk membaca dan menulis file CSV.

Lalu modul os kita butuhkan untuk melakukan clear screen.

Kita juga menyiapkan variabel global bernama csv_filename untuk menentukan file CSV yang akan digunakan.

Untuk saat ini, variabel ini belum kita pakai.. karena kita belum membuat fungsi CRUDS.

Selanjutnya coba perhatikan fungsi clear_screen()

def clear_screen():
    os.system('cls' if os.name == 'nt' else 'clear')

Fungsi ini akan kita gunakan untuk membersihkan layar. Fungsi ini sebenarnya akan menjalankan perintah cls (jika di Windows) dan clear (jika di Linux dan Unix).

Berikutnya kita membuat fungsi show_menu() yang akan menampilkan daftar menu dan menjalankan fungsi tertentu sesuai dengan menu yang dipilih oleh user.

Terakhir kita membuat fungsi back_to_menu() untuk kembali ke menu utama.

Aplikasi ini belum bisa dijalankan, karena kita belum membuat fungsi-fungsi yang lain seperti show_contact(), create_contact(), edit_contact(), delete_contact(), dan search_contact().

Tapi kalau kamu penasaran hasilnya seperti apa..

..ini adalah hasil akhirnya nanti:

Tampilan program akhir yang akan dibuat

Nah sekarang mari kita lanjutkan membuat fungsi menu yang belum ada.

Membuat Fungsi Lihat Data

Fungsi ini akan dijalankan saat user memilih menu 1, yakni melihat daftar kontak.

Silakan tambahkan fungsi show_contact(), di bawah fungsi back_to_menu().

def show_contact():
    clear_screen()
    contacts = []
    with open(csv_filename) as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=",")
        for row in csv_reader:
            contacts.append(row)
    
    if (len(contacts) > 0):
        labels = contacts.pop(0)
        print(f"{labels[0]} \t {labels[1]} \t\t {labels[2]}")
        print("-"*34)
        for data in contacts:
            print(f'{data[0]} \t {data[1]} \t {data[2]}')
    else:
        print("Tidak ada data!")
    back_to_menu()

Fungsi show_contact() akan membaca file CSV kemudian menampilkan datanya.

Jika tidak ada data di dalam file CSV, maka akan ditampilkan pesan "Tidak ada data!".

Membuat Fungsi Create

Fungsi ini akan dipanggil saat user memilih menu Buat Kontak Baru.

Pada fungsi ini kita akan meminta user untuk menginputkan data baru.

Kemudian data tersebut kita tulis ke dalam file CSV.

Mari kita buat…

Silakan tambahkan fungsi create_contact() di bawah kode fungsi show_contact().

def create_contact():
    clear_screen()
    with open(csv_filename, mode='a') as csv_file:
        fieldnames = ['NO', 'NAMA', 'TELEPON']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        
        no = input("No urut: ")
        nama = input("Nama lengkap: ")
        telepon = input("No. Telepon: ")

        writer.writerow({'NO': no, 'NAMA': nama, 'TELEPON': telepon})    
        print("Berhasil disimpan!")
    
    back_to_menu()

Pada fungsi ini, kita menggunakan mode a (append) untuk membuka file CSV.. Karena kita ingin menambah data, bukan menulis ulang.

Membuat Fungsi Cari

Fungsi cari akan dieksekusi saat user memilih menu cari kontak. Silakan tambah fungsi search_contact() di bawah fungsi create_contact() dengan isi seperti ini:

def search_contact():
    clear_screen()
    contacts = []

    with open(csv_filename, mode="r") as csv_file:
        csv_reader = csv.DictReader(csv_file)
        for row in csv_reader:
            contacts.append(row)

    no = input("Cari berdasarkan nomer urut> ")

    data_found = []

    # mencari contact
    indeks = 0
    for data in contacts:
        if (data['NO'] == no):
            data_found = contacts[indeks]
            
        indeks = indeks + 1

    if len(data_found) > 0:
        print("DATA DITEMUKAN: ")
        print(f"Nama: {data_found['NAMA']}")
        print(f"Telepon: {data_found['TELEPON']}")
    else:
        print("Tidak ada data ditemukan")
    back_to_menu()

Membuat Fungsi Edit

Fungsi edit akan dieksekusi saat user memilih menu edit kontak. Fungsi akan melakukan baca data, lalu mencari data berdasarkan nomer yang diinputkan. Setelah itu, menulis ulang semua data.

Silakan tambahkan fungsi edit_contact() di bawah fungsi search_contact() dengan isi seperti ini:

def edit_contact():
    clear_screen()
    contacts = []

    with open(csv_filename, mode="r") as csv_file:
        csv_reader = csv.DictReader(csv_file)
        for row in csv_reader:
            contacts.append(row)

    print("NO \t NAMA \t\t TELEPON")
    print("-" * 32)

    for data in contacts:
        print(f"{data['NO']} \t {data['NAMA']} \t {data['TELEPON']}")

    print("-----------------------")
    no = input("Pilih nomer kontak> ")
    nama = input("nama baru: ")
    telepon = input("nomer telepon baru: ")

    # mencari contact dan mengubah datanya
    # dengan data yang baru
    indeks = 0
    for data in contacts:
        if (data['NO'] == no):
            contacts[indeks]['NAMA'] = nama
            contacts[indeks]['TELEPON'] = telepon
        indeks = indeks + 1

    # Menulis data baru ke file CSV (tulis ulang)
    with open(csv_filename, mode="w") as csv_file:
        fieldnames = ['NO', 'NAMA', 'TELEPON']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        writer.writeheader()
        for new_data in contacts:
            writer.writerow({'NO': new_data['NO'], 'NAMA': new_data['NAMA'], 'TELEPON': new_data['TELEPON']}) 

    back_to_menu()

Pada fungsi edit_contact(), kita menggunakan mode w (write) untuk menulis ulang semua data di CSV.

Membuat Fungsi Delete

Fungsi delete akan dieksekusi saat user memilih menu hapus kontak. Fungsi ini sebenarnya hampir sama dengan fungsi edit_contact().

Fungsi delete akan menghapus data sesuai dengan nomer urut data yang diinputkan user.

Silakan tambahkan fungsi delete_contact() di bawah fungsi edit_contact() dengan isi seperti ini:

def delete_contact():
    clear_screen()
    contacts = []

    with open(csv_filename, mode="r") as csv_file:
        csv_reader = csv.DictReader(csv_file)
        for row in csv_reader:
            contacts.append(row)

    print("NO \t NAMA \t\t TELEPON")
    print("-" * 32)

    for data in contacts:
        print(f"{data['NO']} \t {data['NAMA']} \t {data['TELEPON']}")

    print("-----------------------")
    no = input("Hapus nomer> ")

    # mencari contact dan mengubah datanya
    # dengan data yang baru
    indeks = 0
    for data in contacts:
        if (data['NO'] == no):
            contacts.remove(contacts[indeks])
        indeks = indeks + 1

    # Menulis data baru ke file CSV (tulis ulang)
    with open(csv_filename, mode="w") as csv_file:
        fieldnames = ['NO', 'NAMA', 'TELEPON']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        writer.writeheader()
        for new_data in contacts:
            writer.writerow({'NO': new_data['NO'], 'NAMA': new_data['NAMA'], 'TELEPON': new_data['TELEPON']}) 

    print("Data sudah terhapus")
    back_to_menu()

Membuat Main Loop

Main loop kita butuhkan agar program terus berjalan selama kita tidak menutupnya.

Silakan tambahkan main loop di bagian akhir seperti ini:

if __name__ == "__main__":
    while True:
        show_menu()

Maka sekarang kode lengkap programnya akan menjadi seperti ini:

import csv
import os

csv_filename = 'contacts.csv'

def clear_screen():
    os.system('cls' if os.name == 'nt' else 'clear')

def show_menu():
    clear_screen()
    print("=== APLIKASI KONTAK ===")
    print("[1] Lihat Daftar Kotak")
    print("[2] Buat Kontak Baru")
    print("[3] Edit Kontak")
    print("[4] Hapus Kontak")
    print("[5] Cari Kontak")
    print("[0] Exit")
    print("------------------------")
    selected_menu = input("Pilih menu> ")
    
    if(selected_menu == "1"):
        show_contact()
    elif(selected_menu == "2"):
        create_contact()
    elif(selected_menu == "3"):
        edit_contact()
    elif(selected_menu == "4"):
        delete_contact()
    elif(selected_menu == "5"):
        search_contact()
    elif(selected_menu == "0"):
        exit()
    else:
        print("Kamu memilih menu yang salah!")
        back_to_menu()

def back_to_menu():
    print("\n")
    input("Tekan Enter untuk kembali...")
    show_menu()


def show_contact():
    clear_screen()
    contacts = []
    with open(csv_filename) as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=",")
        for row in csv_reader:
            contacts.append(row)

    if (len(contacts) > 0):
        labels = contacts.pop(0)
        print(f"{labels[0]} \t {labels[1]} \t\t {labels[2]}")
        print("-"*34)
        for data in contacts:
            print(f'{data[0]} \t {data[1]} \t {data[2]}')
    else:
        print("Tidak ada data!")
    back_to_menu()


def create_contact():
    clear_screen()
    with open(csv_filename, mode='a') as csv_file:
        fieldnames = ['NO', 'NAMA', 'TELEPON']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        
        no = input("No urut: ")
        nama = input("Nama lengkap: ")
        telepon = input("No. Telepon: ")

        writer.writerow({'NO': no, 'NAMA': nama, 'TELEPON': telepon})
        print("Berhasil disimpan!")

    back_to_menu()


def search_contact():
    clear_screen()
    contacts = []

    with open(csv_filename, mode="r") as csv_file:
        csv_reader = csv.DictReader(csv_file)
        for row in csv_reader:
            contacts.append(row)

    no = input("Cari berdasarkan nomer urut> ")

    data_found = []

    # mencari contact
    indeks = 0
    for data in contacts:
        if (data['NO'] == no):
            data_found = contacts[indeks]
            
        indeks = indeks + 1

    if len(data_found) > 0:
        print("DATA DITEMUKAN: ")
        print(f"Nama: {data_found['NAMA']}")
        print(f"Telepon: {data_found['TELEPON']}")
    else:
        print("Tidak ada data ditemukan")
    back_to_menu()
    


def edit_contact():
    clear_screen()
    contacts = []

    with open(csv_filename, mode="r") as csv_file:
        csv_reader = csv.DictReader(csv_file)
        for row in csv_reader:
            contacts.append(row)

    print("NO \t NAMA \t\t TELEPON")
    print("-" * 32)

    for data in contacts:
        print(f"{data['NO']} \t {data['NAMA']} \t {data['TELEPON']}")

    print("-----------------------")
    no = input("Pilih nomer kontak> ")
    nama = input("nama baru: ")
    telepon = input("nomer telepon baru: ")

    # mencari contact dan mengubah datanya
    # dengan data yang baru
    indeks = 0
    for data in contacts:
        if (data['NO'] == no):
            contacts[indeks]['NAMA'] = nama
            contacts[indeks]['TELEPON'] = telepon
        indeks = indeks + 1

    # Menulis data baru ke file CSV (tulis ulang)
    with open(csv_filename, mode="w") as csv_file:
        fieldnames = ['NO', 'NAMA', 'TELEPON']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        writer.writeheader()
        for new_data in contacts:
            writer.writerow({'NO': new_data['NO'], 'NAMA': new_data['NAMA'], 'TELEPON': new_data['TELEPON']}) 

    back_to_menu()



def delete_contact():
    clear_screen()
    contacts = []

    with open(csv_filename, mode="r") as csv_file:
        csv_reader = csv.DictReader(csv_file)
        for row in csv_reader:
            contacts.append(row)

    print("NO \t NAMA \t\t TELEPON")
    print("-" * 32)

    for data in contacts:
        print(f"{data['NO']} \t {data['NAMA']} \t {data['TELEPON']}")

    print("-----------------------")
    no = input("Hapus nomer> ")

    # mencari contact dan mengubah datanya
    # dengan data yang baru
    indeks = 0
    for data in contacts:
        if (data['NO'] == no):
            contacts.remove(contacts[indeks])
        indeks = indeks + 1

    # Menulis data baru ke file CSV (tulis ulang)
    with open(csv_filename, mode="w") as csv_file:
        fieldnames = ['NO', 'NAMA', 'TELEPON']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        writer.writeheader()
        for new_data in contacts:
            writer.writerow({'NO': new_data['NO'], 'NAMA': new_data['NAMA'], 'TELEPON': new_data['TELEPON']}) 

    print("Data sudah terhapus")
    back_to_menu()

if __name__ == "__main__":
    while True:
        show_menu()

Waah, lumayan panjang ya..

Oke sekarang mari kita:

Uji Coba Program

Melihat daftar kontak:

Uji coba aplikasi: lihat data

Menambahkan data baru:

Uji coba aplikasi: menambahkan data

Edit Data:

Uji coba aplikasi: edit data

Mencari Data:

Uji coba aplikasi: mencari data

Menghapus Data:

Uji coba aplikasi: menghapus data

Salah Pilih Menu:

Uji coba aplikasi: Salah Pilih Menu

Keluar:

Uji coba aplikasi: keluar

Akhir Kata…

Walaupun masih belum sempurna, aplikasi bisa digunakan seperti yang diharapkan. Dari contoh aplikasi ini, kita dapat memahami.. kapan sebaiknya menggunakan mode a, r, dan w dalam membuka file CSV.

Jika ada kesulitan dalam mengikuti tutorial ini, silakan tanyakan melalui kolom komentar.

Oh iya, source code tutorial ini bisa kamu download di Github.

🎁 [ Download Source Code]

Terima kasih sudah mengikuti tutorial ini sampai akhir 🙏..

📖 untuk tutorial Python yang lainnya, cek di List tutorial Python