Python 处理 CSV 文件完全指南
用 Python 处理 CSV 文件:csv 模块读写、字典方式操作、方言与格式处理、数据校验清洗,以及何时该上 pandas。
直接回答:Python 标准库的 csv 模块无需安装即可处理 CSV 文件:reader/writer 做行级读写,DictReader/DictWriter 按列名操作,dialect 机制适配各种分隔符与引号风格;遇到大数据量或复杂分析时再升级到 pandas。
为什么 CSV 值得专门学
CSV 是数据交换的通用语:报表导出、系统对接、配置下发、日志归档到处都有它。看似简单的格式暗藏陷阱:字段里逗号、换行、引号的转义规则,编码差异,方言分歧——用 split(",") 手写解析迟早翻车,标准库已经把坑都填平了。
读取 CSV
import csv
with open("users.csv", newline="", encoding="utf-8") as f:
reader = csv.reader(f)
header = next(reader, None) # 表头
for row in reader:
print(row) # 每行是字符串列表
注意 newline="":这是官方推荐写法,让 csv 模块自己处理换行符差异,跨平台行为一致。
字典方式:按列名操作
with open("users.csv", newline="", encoding="utf-8") as f:
for row in csv.DictReader(f):
print(row["email"], row["age"])
DictReader 按表头映射字段,但缺列、多列和重复列名仍需检查,可读性完胜下标访问。想直接用对象属性访问,还可以配 namedtuple。
写入 CSV
rows = [
{"name": "张三", "email": "zhangsan@example.com"},
{"name": "李四", "email": "lisi@example.com"},
]
with open("out.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["name", "email"])
writer.writeheader()
writer.writerows(rows)
小贴士:utf-8-sig 编码带 BOM,Excel 打开中文不乱码——给运营同事的导出文件请认准它。
方言与格式处理
现实世界不止逗号分隔:制表符(TSV)、分号(欧洲 Excel)、管道符都常见。
csv.register_dialect("pipes", delimiter="|", quoting=csv.QUOTE_MINIMAL)
with open("data.psv", newline="") as f:
reader = csv.reader(f, dialect="pipes")
不确定文件方言时,csv.Sniffer().sniff(sample) 可以自动探测分隔符与引号规则。
校验与清洗
入库前的 CSV 校验套路:
def clean_rows(path):
with open(path, newline="", encoding="utf-8") as f:
for i, row in enumerate(csv.DictReader(f), start=2):
if not row.get("email") or "@" not in row["email"]:
print(f"第 {i} 行邮箱非法,跳过")
continue
try:
row["age"] = int(row.get("age") or 0)
except (ValueError, TypeError):
print(f"第 {i} 条记录年龄非法,跳过")
continue
yield row
记录号不一定等于物理行号,字段可含换行;需物理位置时用 reader.line_num。坏行应按业务要求拒绝、隔离或跳过。大批量数据用生成器流式处理,避免全量读进内存。
什么时候上 pandas
行级读写、格式转换:标准库就够。需要聚合、透视、关联、百万行级性能:pandas 的 read_csv / to_csv 是更顺手的工具。
常见问题(FAQ)
Q:字段内含换行的 CSV 怎么处理?
A:csv 模块按 RFC 4180 正确处理引号包裹的多行字段——前提是你用了 csv 模块而不是 split。这也是不要手写解析的最大理由。
Q:中文乱码怎么排查?
A:先确认真实编码(file 命令或 chardet 探测),读取时显式指定 encoding=。Excel 导出的 CSV 常见 GBK/ANSI 编码。
Q:几个 G 的大文件怎么读?
A:csv.reader 本身就是迭代器,逐条处理,内存主要取决于当前记录大小;千万别 list(reader)。pandas 场景用 chunksize 参数分块读。
官方参考
本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。