Langsung ke konten

Membaca dan Menulis CSV dan JSON di Python

CSV dan JSON sering dipakai untuk bertukar data di Python. Artikel ini membahas cara membaca dan menulis keduanya memakai modul csv dan json bawaan.

Belajar Python Level Basic
Belajar Python Level Basic
Advertisement

Artikel ini bagian dari seri Belajar Python Level Basic di hanifmu.com. Di artikel sebelumnya kita sudah membahas with Statement. Sekarang kita beri struktur pada data yang disimpan.

File teks biasa menyimpan data apa adanya. Saat data mulai berupa tabel atau daftar berpasangan, menyimpan dan membacanya kembali secara manual jadi merepotkan. CSV dan JSON menyelesaikan masalah itu.

CSV dan JSON

CSV (Comma Separated Values) menyimpan data tabel dalam teks. Setiap baris adalah satu data, dan setiap kolom dipisahkan koma. Format ini cocok untuk data yang berbentuk baris dan kolom.

JSON (JavaScript Object Notation) menyimpan data terstruktur dengan pasangan key dan value. Bentuknya mirip dictionary Python, sehingga cocok untuk data bersarang.

Keduanya berupa teks biasa, jadi mudah dibuka di editor apa pun dan mudah dikirim lewat jaringan. Python sudah menyediakan modul csv dan json tanpa perlu instalasi tambahan.

Untuk menulis CSV, gunakan modul csv:

import csv

data = [
    ["Nama", "Umur", "Kota"],
    ["Budi", 25, "Jakarta"],
    ["Sari", 30, "Bandung"],
    ["Anton", 22, "Surabaya"],
]

with open("siswa.csv", "w", newline="", encoding="utf-8") as file:
    penulis = csv.writer(file)
    penulis.writerows(data)

Isi siswa.csv:

Nama,Umur,Kota
Budi,25,Jakarta
Sari,30,Bandung
Anton,22,Surabaya

Parameter newline="" penting saat menulis CSV. Tanpa itu, baris kosong bisa muncul di Windows karena perbedaan cara menandai akhir baris.

writerows() menulis beberapa baris sekaligus. Untuk satu baris, gunakan writerow():

with open("siswa.csv", "a", newline="", encoding="utf-8") as file:
    penulis = csv.writer(file)
    penulis.writerow(["Rina", 27, "Semarang"])

Membaca CSV

Untuk membaca, gunakan csv.reader(). Hasilnya berupa baris-baris yang bisa diiterasi:

import csv

with open("siswa.csv", "r", encoding="utf-8") as file:
    pembaca = csv.reader(file)
    for baris in pembaca:
        print(baris)

Output:

['Nama', 'Umur', 'Kota']
['Budi', '25', 'Jakarta']
['Sari', '30', 'Bandung']
['Anton', '22', 'Surabaya']

Perhatikan bahwa semua nilai terbaca sebagai string, termasuk umur. Kalau butuh angka, konversi dulu.

CSV dengan Header

Modul csv punya DictReader dan DictWriter yang memakai baris pertama sebagai nama kolom. Cara ini membuat kode lebih mudah dibaca karena tidak perlu mengingat urutan kolom.

import csv

with open("siswa.csv", "r", encoding="utf-8") as file:
    pembaca = csv.DictReader(file)
    for baris in pembaca:
        print(f"{baris['Nama']} dari {baris['Kota']}")

Output:

Budi dari Jakarta
Sari dari Bandung
Anton dari Surabaya

Untuk menulis dengan header otomatis:

import csv

data = [
    {"Nama": "Budi", "Umur": 25, "Kota": "Jakarta"},
    {"Nama": "Sari", "Umur": 30, "Kota": "Bandung"},
]

with open("siswa.csv", "w", newline="", encoding="utf-8") as file:
    kolom = ["Nama", "Umur", "Kota"]
    penulis = csv.DictWriter(file, fieldnames=kolom)
    penulis.writeheader()
    penulis.writerows(data)

Modul json mengubah struktur data Python menjadi teks JSON:

import json

siswa = {
    "nama": "Budi",
    "umur": 25,
    "hobi": ["membaca", "bersepeda"],
}

with open("siswa.json", "w", encoding="utf-8") as file:
    json.dump(siswa, file, indent=2)

Isi siswa.json:

{
  "nama": "Budi",
  "umur": 25,
  "hobi": [
    "membaca",
    "bersepeda"
  ]
}

Parameter indent=2 membuat hasilnya rapi dan mudah dibaca manusia. Tanpa itu, seluruh JSON ditulis dalam satu baris.

Untuk mengubah objek menjadi string tanpa menyimpannya ke file, gunakan json.dumps():

import json

teks = json.dumps({"nama": "Sari", "umur": 30})
print(teks)
# {"nama": "Sari", "umur": 30}

Membaca JSON

Untuk membaca, gunakan json.load():

import json

with open("siswa.json", "r", encoding="utf-8") as file:
    data = json.load(file)

print(data["nama"])   # Budi
print(data["hobi"])   # ['membaca', 'bersepeda']

Hasilnya berupa dictionary biasa, jadi bisa diakses dengan key seperti biasanya.

Kalau JSON berada dalam string, gunakan json.loads():

import json

teks = '{"nama": "Sari", "umur": 30}'
data = json.loads(teks)

print(data["nama"])   # Sari

Menangani Data Tidak Valid

Saat membaca JSON, format yang salah akan memicu JSONDecodeError. Bungkus dengan try dan except agar program tetap aman:

import json

try:
    with open("siswa.json", "r", encoding="utf-8") as file:
        data = json.load(file)
except FileNotFoundError:
    print("File tidak ditemukan")
except json.JSONDecodeError:
    print("Isi file bukan JSON yang valid")
else:
    print(data)

Perhatikan juga bahwa tipe data JSON terbatas. Tipe seperti tuple dan set tidak dikenal JSON. tuple akan berubah menjadi list saat dibaca kembali.

Kapan Memakai CSV dan JSON?

AspekCSVJSON
Bentuk dataTabel baris dan kolomBersarang, key dan value
UkuranLebih ringkas untuk data tabelLebih besar karena key diulang
KeterbacaanSederhana, cocok untuk spreadsheetLebih jelas strukturnya
Penggunaan umumData hasil ekspor, laporanAPI, konfigurasi, data bertingkat

Pakai CSV kalau datanya rapi seperti tabel. Pakai JSON kalau strukturnya bertingkat, misalnya daftar siswa yang tiap siswa punya daftar nilai.

Contoh Program: Konversi CSV ke JSON

Mari ubah data tabel menjadi JSON bertingkat:

# csv_ke_json.py

import csv
import json

siswa = []

with open("siswa.csv", "r", encoding="utf-8") as file:
    pembaca = csv.DictReader(file)
    for baris in pembaca:
        siswa.append({
            "nama": baris["Nama"],
            "umur": int(baris["Umur"]),
            "kota": baris["Kota"],
        })

with open("siswa.json", "w", encoding="utf-8") as file:
    json.dump(siswa, file, indent=2, ensure_ascii=False)

print(f"{len(siswa)} data berhasil dikonversi")

Program ini membaca CSV, mengubah setiap baris menjadi dictionary, lalu menyimpannya sebagai JSON. Perhatikan int(baris["Umur"]) untuk mengembalikan umur menjadi angka, dan ensure_ascii=False agar karakter non-ASCII tetap terbaca.

Kesalahan Umum Pemula

  • Lupa newline="" saat menulis CSV — bisa muncul baris kosong di Windows.
  • Mengira hasil csv.reader() sudah berupa angka — semua terbaca sebagai string.
  • Menulis JSON tanpa indent — hasilnya satu baris panjang dan sulit dibaca.
  • Menyimpan tipe yang tidak didukung JSON — set dan tuple perlu dikonversi dulu.
  • Tidak menangani JSONDecodeError — satu file rusak bisa menghentikan seluruh program.

Ringkasan

  • CSV menyimpan data tabel, JSON menyimpan data terstruktur dengan key dan value
  • Modul csv menyediakan reader, writer, DictReader, dan DictWriter
  • Selalu tambahkan newline="" saat menulis CSV
  • Modul json menyediakan dump, dumps, load, dan loads
  • indent membuat JSON rapi, ensure_ascii=False menjaga karakter khusus
  • Bungkus pembacaan file dengan penanganan error seperti JSONDecodeError

Langkah Selanjutnya

Kamu sudah bisa menyimpan dan mengambil data dalam format yang terstruktur. Bekal ini menutup perjalanan panjang dari variabel sampai file.

Selanjutnya kita akan membahas cara memecah program menjadi beberapa file, memakai modul bawaan Python, serta mengelola package dengan pip dan virtual environment.