Python JSON 與 CSV

Python JSON 與 CSV(JSON and CSV)

這篇 Python JSON 教學處理兩種最常見的資料格式:JSON 是 API 與設定檔的通用語言(長得就像 Python 的 dict),CSV 則是表格資料與 Excel 的交換格式。兩者 Python 都內建支援,不用裝任何套件。

JSON:dict 與字串互轉

函式方向用途
json.dumps(obj)dict → JSON 字串傳給 API、顯示
json.loads(s)JSON 字串 → dict解析 API 回應
json.dump(obj, f)dict → JSON 檔案存設定檔
json.load(f)JSON 檔案 → dict讀設定檔

(口訣:有 s 的處理字串、沒 s 的處理檔案。)

import json

student = {"name": "小明", "age": 25, "scores": [85, 90]}

# dict → JSON 字串
text = json.dumps(student, ensure_ascii=False)
print(text)
print(type(text))

# JSON 字串 → dict
data = json.loads(text)
print(data["name"])

執行輸出:

{"name": "小明", "age": 25, "scores": [85, 90]}
<class 'str'>
小明

ensure_ascii=False 是中文必加——不加的話中文會變成 \u5c0f\u660e 這種跳脫序列。

JSON 檔案讀寫

import json

config = {"app": "部落格", "version": 2, "debug": False}

# 寫入 JSON 檔(indent 排版方便人讀)
with open("config.json", "w", encoding="utf-8") as f:
    json.dump(config, f, ensure_ascii=False, indent=2)

# 讀回來
with open("config.json", "r", encoding="utf-8") as f:
    loaded = json.load(f)

print(loaded["app"], loaded["version"])

執行輸出:

部落格 2

注意 JSON 與 Python 的對應差異:True/Falsetrue/falseNonenull、key 一律雙引號。

CSV:用 DictReader 讀

CSV 每行是一筆資料、逗號分隔。DictReader 把每行變成 dict(用第一行當欄位名),比按索引取值好讀得多。假設 students.csv 內容如下:

name,score,city
小明,85,台北
小華,92,台中
import csv

with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(f"{row['name']}({row['city']}):{row['score']} 分")

執行輸出:

小明(台北):85 分
小華(台中):92 分

注意:CSV 讀進來的值全部是字串row['score'] 要運算前先 int()

CSV:用 DictWriter 寫

import csv

students = [
    {"name": "小明", "score": 85},
    {"name": "小華", "score": 92},
]

with open("out.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "score"])
    writer.writeheader()
    writer.writerows(students)

print("寫入完成")

執行輸出:

寫入完成

newline="" 在 Windows 上必加,否則每筆資料之間會多出空行——這是 CSV 寫入最常見的問題。

常見錯誤

1. json.decoder.JSONDecodeError

JSON 格式不合法:單引號(JSON 只准雙引號)、結尾多逗號、或檔案根本是空的。拿到外部 JSON 先用 try except 包住解析。

2. 中文變成 \uXXXX

json.dumpsjson.dump 忘了 ensure_ascii=False

3. CSV 寫出來每行中間多一個空行

Windows 上開檔忘了 newline=""。Excel 開啟若中文亂碼,改用 encoding="utf-8-sig" 寫入(多了 BOM 讓 Excel 認得)。

總結

JSON:dumps/loads 對字串、dump/load 對檔案、中文必加 ensure_ascii=False;CSV:DictReader 讀(值全是字串記得轉型)、DictWriter 寫(newline="" 必加、給 Excel 用 utf-8-sig)。下一篇處理另一種無所不在的資料:日期與時間。

延伸閱讀