CSV 是 Comma-Separated Values 的缩写。它用纯文本保存二维表格:一行是一条记录,一列是一个字段,第一行通常是表头。
先认识一张成绩表
本节从一张只有三列的小表开始。每一行都拥有相同字段,因此很容易对应到 Python 的列表或字典。
| Name | Python | Math |
|---|---|---|
| Alice | 92 | 85 |
| Bob | 78 | 90 |
| Mia | 88 | 95 |
Name,Python,Math
Alice,92,85
Bob,78,90
Mia,88,95知识测验
题目
CSV 文件第一行通常用来做什么?
用 csv.writer 写入
不要手动拼接逗号。csv.writer 会按 CSV 规则处理字段;writerow() 写一行,writerows() 写多行。写 CSV 时使用 newline="",让 csv 模块统一处理换行。
import csv
rows = [
["Name", "Python", "Math"],
["Alice", 92, 85],
["Bob", 78, 90],
["Mia", 88, 95]
]
with open("scores.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerows(rows)知识测验
题目
使用 csv.writer 写文件时,为什么常写 newline=""?
用 csv.reader 按位置读取
csv.reader 把每一行读成一个字符串列表。第一行是表头,可以先用 next(reader) 取出;后续数据行使用位置索引读取,例如 row[0] 是姓名、row[1] 是 Python 分数。CSV 本质是文本,所以分数读入后仍是字符串,计算前要转成整数。
import csv
with open("scores.csv", "r", encoding="utf-8") as file:
reader = csv.reader(file)
header = next(reader)
for row in reader:
python_score = int(row[1])
math_score = int(row[2])
average = (python_score + math_score) / 2
print(row[0], "%.1f" % average)Alice 88.5
Bob 84.0
Mia 91.5知识测验
题目
csv.reader 读出的 row[1] 为什么还要用 int(row[1]) 转换?
读入、计算、再写出报告
一个清晰的 CSV 程序通常分三步:用 csv.reader 读入并转换类型、计算新数据、再用 csv.writer 写出带表头的结果。
1 · Read csv.reader
2 · Transformint + average
3 · Write csv.writer
import csv
report = [["Name", "Average"]]
with open("scores.csv", "r", encoding="utf-8") as file:
reader = csv.reader(file)
next(reader)
for row in reader:
average = (int(row[1]) + int(row[2])) / 2
report.append([row[0], "%.1f" % average])
with open("report.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerows(report)Name,Average
Alice,88.5
Bob,84.0
Mia,91.5动手练习
创建并读取通讯录 CSV
- 使用 csv.writer 创建 contacts.csv。
- 表头为 Name、Phone、Email,写入三条具体联系人。
- 用 csv.reader 重新读取,并用 next(reader) 跳过表头。
- 按“姓名 → 邮箱域名”打印,例如 Alice → example.com。
动手练习
汇总商品销售额
- 创建 sales.csv,表头为 Product、Quantity、UnitPrice。
- 写入 Apple 3×2.5、Notebook 2×12、Apple 4×2.5、Pen 5×3。
- 用 csv.reader 读取并按商品累计 Quantity × UnitPrice。
- 使用 csv.writer 写入 sales_summary.csv,表头为 Product、Revenue,并保留两位小数。