Belajar Membuat Aplikasi CRUDS dengan Python dan File CSV

Belajar Membuat Aplikasi CRUDS dengan Python dan File CSV

97

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

CRUDS merupakan singkatan dari Craete, 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..

Silahkan 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("
")
    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.

Tereakhir 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.

Silahkan 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]} 	 {labels[1]} 		 {labels[2]}")
        print("-"*34)
        for data in contacts:
            print(f'{data[0]} 	 {data[1]} 	 {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…

Silahkan 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. Silahkan 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 berdasrakan 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.

Silahkan 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 	 NAMA 		 TELEPON")
    print("-" * 32)

    for data in contacts:
        print(f"{data['NO']} 	 {data['NAMA']} 	 {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.

Silahkan 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 	 NAMA 		 TELEPON")
    print("-" * 32)

    for data in contacts:
        print(f"{data['NO']} 	 {data['NAMA']} 	 {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.

Silahkan tambahkan main loop di bagian akhir seperti ini:

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

Maka sekarang kode lengkap programnya akan menjadi seperti ini:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
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("
")
    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]} 	 {labels[1]} 		 {labels[2]}")
        print("-"*34)
        for data in contacts:
            print(f'{data[0]} 	 {data[1]} 	 {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 berdasrakan 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 	 NAMA 		 TELEPON")
    print("-" * 32)

    for data in contacts:
        print(f"{data['NO']} 	 {data['NAMA']} 	 {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 	 NAMA 		 TELEPON")
    print("-" * 32)

    for data in contacts:
        print(f"{data['NO']} 	 {data['NAMA']} 	 {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…

Walapun 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, silahkan tanyakan melalui kolom komentar.

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

[Download Source Code]

Terimakasih sudah mengikuti tutorial ini sampai akhir..

Share: