File dan Data · Pelajaran 5 dari 8
Rekap data CSV
10 menit baca · BelajarCode
Banyak aplikasi kasir, marketplace, dan spreadsheet bisa mengekspor data ke CSV. Dengan Python, rekap yang biasanya dikerjakan berjam-jam bisa selesai dalam hitungan detik.
1import csv2from pathlib import Path34Path("penjualan.csv").write_text(5 """tanggal;produk;kategori;jumlah;harga62026-09-01;Kopi susu;Minuman;12;1500072026-09-01;Roti bakar;Makanan;5;1800082026-09-02;Kopi susu;Minuman;15;1500092026-09-02;Teh tarik;Minuman;8;12000102026-09-03;Roti bakar;Makanan;7;18000112026-09-03;Mi goreng;Makanan;4;2000012""",13 encoding="utf-8",14)1516rekap = {}17with open("penjualan.csv", encoding="utf-8", newline="") as f:18 for baris in csv.DictReader(f, delimiter=";"):19 nilai = int(baris["jumlah"]) * int(baris["harga"])20 data = rekap.setdefault(baris["produk"], {"porsi": 0, "omzet": 0})21 data["porsi"] += int(baris["jumlah"])22 data["omzet"] += nilai2324urut = sorted(rekap.items(), key=lambda p: p[1]["omzet"], reverse=True)25with open("rekap_produk.csv", "w", encoding="utf-8", newline="") as f:26 penulis = csv.writer(f, delimiter=";")27 penulis.writerow(["produk", "porsi", "omzet"])28 for produk, data in urut:29 penulis.writerow([produk, data["porsi"], data["omzet"]])3031print(Path("rekap_produk.csv").read_text(encoding="utf-8"))produk;porsi;omzet Kopi susu;27;405000 Roti bakar;12;216000 Teh tarik;8;96000 Mi goreng;4;80000
delimiter=";"dipakai karena file CSV dari aplikasi berbahasa Indonesia sering memakai titik koma.- Hasil rekap juga ditulis sebagai CSV, sehingga bisa langsung dibuka di aplikasi spreadsheet.
newline=""saat membuka file CSV mencegah baris kosong ganda di Windows.
Menggabungkan banyak file
Jika setiap cabang mengirim file CSV sendiri, program bisa menggabungkan semuanya:
1import csv2from pathlib import Path34folder = Path("laporan_cabang")5folder.mkdir(exist_ok=True)6(folder / "cabang_bandung.csv").write_text("produk,omzet\nKopi susu,405000\nTeh tarik,96000\n", encoding="utf-8")7(folder / "cabang_malang.csv").write_text("produk,omzet\nKopi susu,310000\nRoti bakar,144000\n", encoding="utf-8")89total = {}10for berkas in sorted(folder.glob("cabang_*.csv")):11 cabang = berkas.stem.replace("cabang_", "").title()12 with open(berkas, encoding="utf-8", newline="") as f:13 for baris in csv.DictReader(f):14 total[baris["produk"]] = total.get(baris["produk"], 0) + int(baris["omzet"])15 print("Dibaca:", cabang)1617for produk, omzet in sorted(total.items(), key=lambda p: -p[1]):18 print(f"{produk:<11} Rp{omzet:>9,}".replace(",", "."))Dibaca: Bandung Dibaca: Malang Kopi susu Rp 715.000 Roti bakar Rp 144.000 Teh tarik Rp 96.000
berkas.stem adalah nama file tanpa ekstensi. Format {omzet:>9,} menambahkan pemisah ribuan dan meratakan angka ke kanan.
Excel juga bisa dibaca
Untuk file Excel (.xlsx), programmer Python biasa memakai pustaka seperti openpyxl atau pandas yang dipasang dengan pip install. Pustaka itu belum tersedia di Playground, tetapi alurnya sama: baca, olah, tulis hasilnya.
Cek pemahaman
File CSV hasil ekspor aplikasi terbaca sebagai satu kolom panjang berisi teks dengan titik koma. Apa yang paling mungkin terjadi?
Latihan
Rekap per tanggal
Dari file penjualan.csv di atas, buat rekap omzet per tanggal beserta produk terlaris (porsi terbanyak) di tanggal itu.
Pembahasan
1import csv2from pathlib import Path34Path("penjualan.csv").write_text(5 """tanggal;produk;kategori;jumlah;harga62026-09-01;Kopi susu;Minuman;12;1500072026-09-01;Roti bakar;Makanan;5;1800082026-09-02;Kopi susu;Minuman;15;1500092026-09-02;Teh tarik;Minuman;8;12000102026-09-03;Roti bakar;Makanan;7;18000112026-09-03;Mi goreng;Makanan;4;2000012""",13 encoding="utf-8",14)1516per_tanggal = {}17with open("penjualan.csv", encoding="utf-8", newline="") as f:18 for b in csv.DictReader(f, delimiter=";"):19 data = per_tanggal.setdefault(b["tanggal"], {"omzet": 0, "porsi": {}})20 jumlah = int(b["jumlah"])21 data["omzet"] += jumlah * int(b["harga"])22 data["porsi"][b["produk"]] = data["porsi"].get(b["produk"], 0) + jumlah2324for tanggal in sorted(per_tanggal):25 data = per_tanggal[tanggal]26 terlaris = max(data["porsi"], key=data["porsi"].get)27 print(f"{tanggal}: omzet {data['omzet']}, terlaris {terlaris}")2026-09-01: omzet 270000, terlaris Kopi susu 2026-09-02: omzet 321000, terlaris Kopi susu 2026-09-03: omzet 206000, terlaris Roti bakar
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.