CSV (comma-separated values) adalah format pertukaran data yang paling universal: bisa dibuka spreadsheet, dibaca bahasa pemrograman apa pun, dan diperiksa dengan editor teks. Ketika array perlu diberikan ke kolega yang memakai Excel atau ke sistem yang bukan Python, CSV adalah jembatan yang tepat. Kelemahannya sepadan: CSV hanya menyimpan angka sebagai teks, tanpa informasi dtype dan bentuk array.
NumPy menyediakan sepasang fungsi untuk format ini: np.savetxt untuk menulis dan np.loadtxt untuk membaca. Bab ini membahas keduanya beserta parameter pentingnya — delimiter, fmt, header, skiprows, dan usecols — ditambah batasan format dan kapan sebaiknya beralih ke pandas.
Menulis CSV dengan savetxt #
np.savetxt menulis array 2-D sebagai baris-baris teks. Parameter fmt mengatur format angka, delimiter mengatur pemisah kolom, dan header menambahkan baris judul di atasnya:
import numpy as np
harga = np.array([[15000.0, 18000.0, 35000.0],
[15200.0, 17900.0, 35100.0]])
np.savetxt("harga.csv", harga, delimiter=",",
fmt="%.2f", header="beras,gula,minyak")
print(open("harga.csv").read())
baca = np.loadtxt("harga.csv", delimiter=",")
print(baca)
print(baca.dtype, baca.shape)Output yang Dihasilkan:
# beras,gula,minyak
15000.00,18000.00,35000.00
15200.00,17900.00,35100.00
[[15000. 18000. 35000.]
[15200. 17900. 35100.]]
float64 (2, 3)Mari kita bedah:
- Baris 5-6 (
np.savetxt(...)):fmt="%.2f"mencetak setiap angka dengan dua desimal, danheader="beras,gula,minyak"menulis baris judul pertama. - Baris 7 (
print(open(...).read())): isi berkas memperlihatkan header diawali#— NumPy menandai baris keterangan dengan karakter komentar bawaan agar baris itu terlewat saat dibaca kembali. - Baris 8-10:
np.loadtxtdengandelimiter=","membaca berkas tanpa perluskiprows; baris#diabaikan otomatis, dan hasilnya kembalifloat64berbentuk(2, 3).
skiprows dan usecols #
Tidak semua CSV datang dengan header berkomentar. Bila baris pertama adalah teks polos, kita harus melewatkannya dengan skiprows. Parameter usecols membatasi kolom mana yang dibaca — berguna ketika CSV berisi banyak kolom tetapi hanya sebagian yang dibutuhkan:
import numpy as np
harga = np.array([[15000, 18000, 35000],
[15200, 17900, 35100],
[15300, 18100, 34900]])
np.savetxt("harga.csv", harga, fmt="%d", delimiter=",",
header="beras,gula,minyak", comments="")
baca = np.loadtxt("harga.csv", delimiter=",", skiprows=1, usecols=(0, 2))
print(baca)Output yang Dihasilkan:
[[15000. 35000.]
[15200. 35100.]
[15300. 34900.]]Penjelasan tiap bagian:
- Baris 6 (
comments=""): dengan parameter ini header ditulis tanpa tanda#, persis seperti CSV dari aplikasi lain. - Baris 7 (
skiprows=1): baris pertama — header teks — dilewati agar tidak ikut diurai sebagai angka. - Baris 7 (
usecols=(0, 2)): hanya kolom 0 (beras) dan kolom 2 (minyak) yang dibaca; kolom tengah terabaikan, sehingga ketiga baris data kembali berbentuk(3, 2).
Jebakan Array 1-D #
Perilaku np.savetxt yang sering mengejutkan pemula terjadi pada array 1-D: fungsi ini menuliskannya sebagai satu kolom, bukan satu baris. Untuk mendapatkan satu baris CSV, array harus diubah menjadi 2-D terlebih dahulu:
import numpy as np
suhu = np.array([27.5, 28.1, 26.9])
np.savetxt("kolom.csv", suhu, fmt="%.1f")
print(open("kolom.csv").read())
np.savetxt("baris.csv", suhu.reshape(1, -1), fmt="%.1f", delimiter=",")
print(open("baris.csv").read())Output yang Dihasilkan:
27.5
28.1
26.9
27.5,28.1,26.9Mari kita telaah:
- Baris 4-5: array 1-D dengan tiga elemen ditulis menjadi tiga baris, satu angka per baris — perilaku bawaan
savetxtuntuk input 1-D. - Baris 6 (
suhu.reshape(1, -1)): array diubah menjadi 2-D berbentuk(1, 3);-1membiarkan NumPy menghitung jumlah kolom. - Baris 6-7: dengan bentuk
(1, 3),savetxtmenulis satu baris berisi tiga angka yang dipisah koma.
Batasan Format dan Peran Pandas #
np.loadtxt hanya mengurai angka. Satu kolom teks pun membuat penguraian berhenti. Di titik ini pandas lebih tepat digunakan karena read_csv menghasilkan DataFrame yang bisa menampung kolom campuran:
import numpy as np
np.savetxt("teks.csv", np.array([["beras", "15000"]]),
fmt="%s", delimiter=",")
try:
np.loadtxt("teks.csv", delimiter=",")
except ValueError as e:
print("ValueError:", e)
import pandas as pd
df = pd.DataFrame({"komoditas": ["beras", "gula", "minyak"],
"harga": [15000, 18000, 35000]})
df.to_csv("dagang.csv", index=False)
print(open("dagang.csv").read())
df2 = pd.read_csv("dagang.csv")
print(df2.to_string(index=False))Output yang Dihasilkan:
ValueError: could not convert string 'beras' to float64 at row 0, column 1.
komoditas,harga
beras,15000
gula,18000
minyak,35000
komoditas harga
beras 15000
gula 18000
minyak 35000Penjelasan tiap bagian:
- Baris 3-7 (try/except):
np.loadtxtberhenti di kolom teks'beras'dengan pesancould not convert string ... to float64— pembacaan CSV NumPy memang khusus data numerik homogen. - Baris 8-10: pandas menangani data berlabel penuh;
to_csvdenganindex=Falsemenulis berkas tanpa kolom nomor baris. - Baris 11-12:
read_csvmengembalikan DataFrame dengan tipe kolom yang dikenali sendiri — komoditas sebagai teks, harga sebagai bilangan bulat.
| Kebutuhan | Alat yang tepat |
|---|---|
| Array numerik murni, cepat dan ringan | np.savetxt / np.loadtxt |
| Tabel berlabel dengan kolom teks, tanggal, atau kosong | pd.DataFrame.to_csv / read_csv |
| Simpan-muat internal antar skrip Python | .npy / .npz |