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 参数分块读。

官方参考

本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台