第五章 · 文件与IO

JSON 与 CSV 处理

本节目标

学完这一节,你会知道:

  1. JSON 适合保存什么数据
  2. 如何用 json.load()json.dump() 读写 JSON 文件
  3. CSV 适合保存什么数据
  4. 如何用 csv.DictReadercsv.DictWriter 读写表格
  5. 如何把学生成绩保存为 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"])

然后继续改:

  1. 增加一个键 price
  2. 读取后输出所有标签
  3. 把课程信息也写入一个 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)

小结

这一节你学会了:

  1. JSON 适合保存字典、列表这类结构化数据
  2. json.dump() 写 JSON,json.load() 读 JSON
  3. CSV 适合保存表格数据
  4. csv.DictWriter 写 CSV,csv.DictReader 读 CSV
  5. CSV 读出来的值默认是字符串,需要时要转换类型

下一章我们会学习模块与包。它能帮你把越来越多的代码拆分到不同文件里。

JSON 和 CSV,是程序和外界交换小纸条

JSON 像结构清楚的资料卡,CSV 像表格世界的通用语言。把课程、设置、成绩写进文件再读回来,你就迈进了真实数据处理的大门。马哥提醒你:CSV 读出来常是字符串,数字别忘了换回数字。

讨论 (0)

还没有评论,来抢沙发吧!