Python csv 模块¶
概念与用途¶
CSV 是表格交换格式,但分隔符、引号和换行存在方言差异。标准库 csv 能正确处理这些细节,优于手工 split(',')。
核心 API¶
csv.reader/writer 处理行列表,DictReader/DictWriter 处理字段名映射。打开文件时指定 newline="",文本编码通常显式使用 UTF-8。
import csv
from io import StringIO
buffer = StringIO(newline="")
writer = csv.DictWriter(buffer, fieldnames=["name", "note"])
writer.writeheader()
writer.writerow({"name": "Alice", "note": "包含,逗号"})
buffer.seek(0)
print(list(csv.DictReader(buffer)))
核心选项¶
| 选项 | 用途 | 注意 |
|---|---|---|
delimiter |
指定分隔符 | CSV 不一定使用逗号 |
quotechar |
包裹特殊字段 | 不要手工拼接引号 |
newline="" |
交给 csv 管理换行 | 打开文件时设置 |
extrasaction |
处理额外字典键 | 可设为 ignore 或报错 |
示例:校验字段与数字¶
import csv
from io import StringIO
source = StringIO("name,score\nAlice,95\nBob,not-a-number\n")
for row_number, row in enumerate(csv.DictReader(source), start=2):
try:
score = int(row["score"])
except (KeyError, ValueError):
print(f"第 {row_number} 行无效")
else:
print(row["name"], score)
csv 属于标准库,无需安装第三方包。文件仍需限制大小和字段长度;可通过 csv.field_size_limit() 调整上限,但提高前应评估内存风险。
常见错误与安全注意¶
- Excel 打开以
= + - @开头的单元格可能执行公式,导出不可信文本时需防 CSV 注入。 - CSV 没有类型信息,读取后需按 schema 校验和转换。
- 超大文件应逐行处理,不要一次性转成列表。