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.

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:

python
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:

text
# 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:

  1. Baris 5-6 (np.savetxt(...)): fmt="%.2f" mencetak setiap angka dengan dua desimal, dan header="beras,gula,minyak" menulis baris judul pertama.
  2. 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.
  3. Baris 8-10: np.loadtxt dengan delimiter="," membaca berkas tanpa perlu skiprows; baris # diabaikan otomatis, dan hasilnya kembali float64 berbentuk (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:

python
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:

text
[[15000. 35000.]
 [15200. 35100.]
 [15300. 34900.]]

Penjelasan tiap bagian:

  1. Baris 6 (comments=""): dengan parameter ini header ditulis tanpa tanda #, persis seperti CSV dari aplikasi lain.
  2. Baris 7 (skiprows=1): baris pertama — header teks — dilewati agar tidak ikut diurai sebagai angka.
  3. 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:

python
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:

text
27.5
28.1
26.9

27.5,28.1,26.9

Mari kita telaah:

  1. Baris 4-5: array 1-D dengan tiga elemen ditulis menjadi tiga baris, satu angka per baris — perilaku bawaan savetxt untuk input 1-D.
  2. Baris 6 (suhu.reshape(1, -1)): array diubah menjadi 2-D berbentuk (1, 3); -1 membiarkan NumPy menghitung jumlah kolom.
  3. Baris 6-7: dengan bentuk (1, 3), savetxt menulis 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:

python
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:

text
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  35000

Penjelasan tiap bagian:

  1. Baris 3-7 (try/except): np.loadtxt berhenti di kolom teks 'beras' dengan pesan could not convert string ... to float64 — pembacaan CSV NumPy memang khusus data numerik homogen.
  2. Baris 8-10: pandas menangani data berlabel penuh; to_csv dengan index=False menulis berkas tanpa kolom nomor baris.
  3. Baris 11-12: read_csv mengembalikan DataFrame dengan tipe kolom yang dikenali sendiri — komoditas sebagai teks, harga sebagai bilangan bulat.
KebutuhanAlat yang tepat
Array numerik murni, cepat dan ringannp.savetxt / np.loadtxt
Tabel berlabel dengan kolom teks, tanggal, atau kosongpd.DataFrame.to_csv / read_csv
Simpan-muat internal antar skrip Python.npy / .npz