JSON 和 CSV 是日常工作中最常见的两种数据格式:API 接口返回 JSON,表格数据导出 CSV。Python 标准库自带 json 与 csv 模块,学会它们,你就能轻松完成数据读写、清洗与格式转换。
1. JSON 的读写
json 模块的核心是四个函数:dumps/loads 处理字符串,dump/load 处理文件。写入时记得加 ensure_ascii=False 保留中文:
import json
data = {"name": "Ada", "skills": ["Python", "SQL"], "active": True}
with open("user.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
with open("user.json", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["name"]) # Ada
2. CSV 的读写
写 CSV 时务必传 newline="",否则 Windows 上会出现空行:
import csv
with open("scores.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["name", "score"])
writer.writerow(["Ada", 92])
writer.writerow(["Bob", 88])
3. DictReader:按表头读数据
表头是"列名"的 CSV,用 csv.DictReader 读起来最直观,每一行是一个字典:
import csv
with open("scores.csv", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["name"], row["score"])
# 注意:此时 score 是字符串 "92",需要数值时自行转 int
4. JSON 与 CSV 互转
转换的核心是"统一中间格式":先把 CSV 读成字典列表,再一次性写入 JSON;反向操作同理:
import json, csv
rows = []
with open("scores.csv", encoding="utf-8") as f:
for row in csv.DictReader(f):
row["score"] = int(row["score"])
rows.append(row)
with open("scores.json", "w", encoding="utf-8") as f:
json.dump(rows, f, ensure_ascii=False, indent=2)
5. 实战:清洗一份成绩单
假设原始数据里有空值和"是否及格"需要标记,一步到位:
import csv
result = []
with open("raw.csv", encoding="utf-8") as f:
for row in csv.DictReader(f):
score = row["score"].strip()
if not score: # 空值直接跳过
continue
s = int(score)
row["passed"] = s >= 60
result.append(row)
with open("clean.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=result[0].keys())
writer.writeheader()
writer.writerows(result)
6. 常见坑与建议
- 编码:读写都显式指定
encoding="utf-8",避免中文乱码。 - 嵌套 JSON:字典值可以是任意类型,
indent=2让文件可读。 - 大文件:
json.load会一次性载入内存,超大文件考虑 ijson 流式解析。 - CSV 分隔符:文本里出现逗号的情况,交给 csv 模块处理,别手动 split。
💡 学习建议:找一份真实数据(本机日志、公开数据集都行),练习"读 CSV → 清洗 → 写 JSON"的完整流程,数据处理的套路就掌握了。