JSON 与 CSV 处理
本节目标
学完这一节,你会知道:
- JSON 适合保存什么数据
- 如何用
json.load()和json.dump()读写 JSON 文件 - CSV 适合保存什么数据
- 如何用
csv.DictReader和csv.DictWriter读写表格 - 如何把学生成绩保存为 JSON 和 CSV
JSON 常用于配置、接口数据;CSV 常用于表格、Excel 数据交换。
先跑一个例子
新建文件 json_demo.py,写入:
import json
student = {
"name": "小明",
"age": 18,
"scores": [85, 92, 78],
}
with open("student.json", "w", encoding="utf-8") as file:
json.dump(student, file, ensure_ascii=False, indent=2)
with open("student.json", "r", encoding="utf-8") as file:
data = json.load(file)
print(data["name"])
print(data["scores"])
运行:
python3 json_demo.py
你会看到当前目录生成 student.json,里面保存了学生数据。
什么是 JSON?
JSON 是一种文本格式,长得很像 Python 字典和列表。
{
"name": "小明",
"age": 18,
"scores": [85, 92, 78]
}
常见对应关系:
| Python | JSON |
|---|---|
| dict | object |
| list | array |
| str | string |
| int / float | number |
| True / False | true / false |
| None | null |
写入 JSON
import json
data = {
"title": "Python 入门",
"lessons": 25,
"tags": ["Python", "教程"],
}
with open("course.json", "w", encoding="utf-8") as file:
json.dump(data, file, ensure_ascii=False, indent=2)
参数说明:
ensure_ascii=False:中文正常显示indent=2:缩进 2 个空格,文件更容易读
读取 JSON
import json
with open("course.json", "r", encoding="utf-8") as file:
data = json.load(file)
print(data["title"])
如果是 JSON 字符串,可以用:
text = '{"name": "小明", "age": 18}'
data = json.loads(text)
把 Python 数据转成字符串:
json_text = json.dumps(data, ensure_ascii=False, indent=2)
print(json_text)
什么是 CSV?
CSV 是表格文本,每一行是一条记录,每一列用逗号分隔。
name,score,city
小明,85,成都
小红,92,上海
CSV 很适合和 Excel、表格软件交换数据。
写入 CSV
import csv
students = [
{"name": "小明", "score": 85, "city": "成都"},
{"name": "小红", "score": 92, "city": "上海"},
]
with open("students.csv", "w", encoding="utf-8-sig", newline="") as file:
writer = csv.DictWriter(file, fieldnames=["name", "score", "city"])
writer.writeheader()
writer.writerows(students)
utf-8-sig 让 Excel 打开中文 CSV 时更不容易乱码。
newline="" 可以避免某些系统出现空行。
读取 CSV
import csv
with open("students.csv", "r", encoding="utf-8-sig") as file:
reader = csv.DictReader(file)
for row in reader:
print(f"{row['name']}:{row['score']} 分")
注意:CSV 读出来的值默认都是字符串。
如果要计算,需要转换:
score = int(row["score"])
JSON 和 CSV 怎么选?
用 JSON:
- 保存配置
- 保存嵌套数据
- 和 Web API 交换数据
- 数据结构像字典、列表
用 CSV:
- 保存表格
- 给 Excel 打开
- 每行结构都一样
- 数据比较扁平
逐行拆解
再看开头的例子:
json.dump(student, file, ensure_ascii=False, indent=2)
把 Python 字典写入 JSON 文件。
data = json.load(file)
从 JSON 文件读取数据,变回 Python 字典。
data["scores"]
读取字典里的成绩列表。
自己改一改
把 json_demo.py 改成保存课程信息:
import json
course = {
"title": "Python 入门",
"teacher": "马哥",
"lessons": 25,
"tags": ["基础", "零基础", "编程"],
}
with open("course.json", "w", encoding="utf-8") as file:
json.dump(course, file, ensure_ascii=False, indent=2)
with open("course.json", "r", encoding="utf-8") as file:
data = json.load(file)
print(data["title"])
然后继续改:
- 增加一个键
price - 读取后输出所有标签
- 把课程信息也写入一个
course.csv
常见错误
1. 中文变成 \uXXXX
写 JSON 时加:
ensure_ascii=False
2. CSV 数字读出来是字符串
score = row["score"]
如果要计算:
score = int(row["score"])
3. 写 CSV 出现空行
打开文件时加:
newline=""
4. JSON 文件格式写错
JSON 里的字符串必须用双引号,不能用单引号。如果文件格式错误,json.load() 会报错。
小练习
练习 1:保存设置
创建一个字典,保存主题、语言、字体大小,写入 settings.json。
练习 2:读取设置
读取 settings.json,输出主题和语言。
练习 3:导出成绩表
把学生成绩列表写入 scores.csv。
参考答案
练习 1:
import json
settings = {
"theme": "dark",
"language": "zh-CN",
"font_size": 16,
}
with open("settings.json", "w", encoding="utf-8") as file:
json.dump(settings, file, ensure_ascii=False, indent=2)
练习 2:
import json
with open("settings.json", "r", encoding="utf-8") as file:
settings = json.load(file)
print(settings["theme"])
print(settings["language"])
练习 3:
import csv
students = [
{"name": "小明", "score": 85},
{"name": "小红", "score": 92},
]
with open("scores.csv", "w", encoding="utf-8-sig", newline="") as file:
writer = csv.DictWriter(file, fieldnames=["name", "score"])
writer.writeheader()
writer.writerows(students)
小结
这一节你学会了:
- JSON 适合保存字典、列表这类结构化数据
json.dump()写 JSON,json.load()读 JSON- CSV 适合保存表格数据
csv.DictWriter写 CSV,csv.DictReader读 CSV- CSV 读出来的值默认是字符串,需要时要转换类型
下一章我们会学习模块与包。它能帮你把越来越多的代码拆分到不同文件里。
JSON 和 CSV,是程序和外界交换小纸条
JSON 像结构清楚的资料卡,CSV 像表格世界的通用语言。把课程、设置、成绩写进文件再读回来,你就迈进了真实数据处理的大门。马哥提醒你:CSV 读出来常是字符串,数字别忘了换回数字。
还没有评论,来抢沙发吧!