专项练习 · 9 分钟阅读

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

你的练习清单

常见问题

为什么 DictReader 把数字也返回成字符串?

CSV 不携带类型信息。验证后要用 int 或 float 显式转换字段。

读 CSV 一定要用 pandas 吗?

不需要。普通读写用标准库 csv 就够了。需要表格分析时再用 pandas。

QUOTE_MINIMAL 会做什么?

只在字段包含分隔符、引号字符或换行时加引号。它是默认引号模式。

练习 CSV

12 道题,覆盖 reader、DictReader、写入行、引号和文件处理。

打开练习

继续阅读: