Python CSV 练习:读取、写入与引号
CSV 看起来像纯文本,直到字段里出现逗号。csv 模块负责引号、分隔符和行边界,你不需要手工按行拆分。
把行读成列表
csv.reader 返回由列表组成的迭代器。每个字段一开始都是字符串,数字也不例外。除非你决定把第一行当表头,否则它没有特殊含义。需要查看多行时用 list 物化。
import csv
from io import StringIO
rows = list(csv.reader(StringIO("a,b\n1,2\n")))
print(rows[0])
print(rows[1][1])行是字符串列表
把表头当作键
DictReader 把第一行当作字段名。之后每一行变成字典,按列访问更可读。如果文件没有表头,要显式传入 fieldnames,避免第一行数据被当成标签消耗掉。
import csv
from io import StringIO
raw = "name,score\nAda,92\n"
rows = list(csv.DictReader(StringIO(raw)))
print(rows[0]["name"])有名字的列
一次写入一行
csv.writer 写入一行并添加所需行结束符。传入字段列表,而不是预先拼好的字符串,模块才能正确加引号。只有已经拥有多行可迭代对象时才用 writerows。
import csv
from io import StringIO
buffer = StringIO()
writer = csv.writer(buffer)
writer.writerow(["a", "b"])
print(buffer.getvalue().strip())让写入器格式化行
数据需要时才加引号
默认的 QUOTE_MINIMAL 只在需要时加引号,QUOTE_ALL 给每个字段加引号。字段里有逗号、引号或换行时必须加引号,csv 模块会处理转义。
import csv
from io import StringIO
buffer = StringIO()
writer = csv.writer(buffer, quoting=csv.QUOTE_ALL)
writer.writerow(["a,b", "c"])
print(buffer.getvalue().strip())引号是结构的一部分
用 newline="" 打开文件
读写真实文件时,用 newline="" 打开,让 csv 控制行尾。这样可以避免某些平台出现空行。数据含非 ASCII 文本时,要显式指定编码。
import csv
from io import StringIO
buffer = StringIO(newline="")
writer = csv.writer(buffer)
writer.writerow(["name", "note"])
print(buffer.getvalue().strip())把换行交给 csv
你的练习清单
- 记住 csv.reader 返回字符串,不是数字。
- 表头能提供有意义列名时使用 DictReader。
- 把字段列表传给 writer.writerow,不要传拼好的字符串。
- 只有每个字段都需要引号时才用 QUOTE_ALL。
- 真实 CSV 文件用 newline="" 和明确编码打开。
常见问题
为什么 DictReader 把数字也返回成字符串?
CSV 不携带类型信息。验证后要用 int 或 float 显式转换字段。
读 CSV 一定要用 pandas 吗?
不需要。普通读写用标准库 csv 就够了。需要表格分析时再用 pandas。
QUOTE_MINIMAL 会做什么?
只在字段包含分隔符、引号字符或换行时加引号。它是默认引号模式。
练习 CSV
12 道题,覆盖 reader、DictReader、写入行、引号和文件处理。
继续阅读: