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/False 變 true/false、None 變 null、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.dumps/json.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)。下一篇處理另一種無所不在的資料:日期與時間。