Python编程精进:CSV 模块

如果你一直在使用 Python 处理数据,那么你肯定用过 csv 模块。它是 Python 标准库中一个低调的部分,常常被像 pandas 这样的强大工具所掩盖。但如果我告诉你,Python 内置的 csv 模块不仅能读写行数据,还能做更多事情呢?

无论是自动化生成报告、编写快速脚本,还是处理来自遗留系统的复杂数据,这些 10 个强大且令人惊喜的技巧 将为你解锁 csv 模块的新可能。

让我们开始吧。

特性 csv.reader / DictReader pandas.read_csv
轻量级脚本 ✔️ ✔️
处理大文件 (使用生成器) ✔️
复杂解析逻辑 ❌ ✔️
外部依赖 ❌ (需要pandas)

1. 使用 csv.Sniffer() 检测文件格式

当你不确定文件是用逗号分隔还是用制表符分隔时,csv.Sniffer() 就成了你最好的帮手。

python 复制代码
import csv
with open('unknown.csv', 'r') as file:
    sample = file.read(1024)
    dialect = csv.Sniffer().sniff(sample)
    file.seek(0)
    reader = csv.reader(file, dialect)
    for row in reader:
        print(row)

为什么它很有用:

  • 自动检测分隔符
  • 节省手动检查的时间
  • 非常适合用户上传的文件

2. 检查文件是否有标题行

csv.Sniffer() 的另一个亮点是 has_header()。它可以 猜测 CSV 文件的第一行是否包含标题。

python 复制代码
has_headers = csv.Sniffer().has_header(sample)
print("Has header:", has_headers)

何时使用:

  • 在动态 ETL 管道中
  • 处理不一致的数据集时

3. 创建自定义方言以提高可复用性

厌倦了反复指定相同的分隔符和引用字符?你可以注册一个 自定义方言:

python 复制代码
csv.register_dialect('pipes', delimiter='|', quoting=csv.QUOTE_NONE)
with open('data.txt') as f:
    reader = csv.reader(f, dialect='pipes')
    for row in reader:
        print(row)

好处:

  • 代码更简洁,可复用性更高
  • 非常适合非标准格式,如 |、~ 或自定义分隔符

4. 使用 DictWriter 以字段级精度写入 CSV

你可能知道 csv.writer,但 DictWriter 在写入具有特定键的行时能给你 更多控制权。

python 复制代码
with open('output.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=['name', 'age'])
    writer.writeheader()
    writer.writerow({'name': 'Alice', 'age': 30})

为什么这很重要:

  • 让你的代码更具自文档性
  • 与来自 API 或数据库的字典配合得很好

5. 高效读取特定列

有时你不需要整个文件,只需要几列。将 DictReader 与智能索引结合使用:

python 复制代码
with open('employees.csv') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row['email'], row['department'])

注意:

  • 避免不必要的内存使用
  • 加快大文件的处理速度

6. 使用生成器表达式提高速度

想在不占用大量内存的情况下处理超大 CSV 文件?将 csv.reader() 与生成器搭配使用。

python 复制代码
with open('bigfile.csv') as f:
    reader = csv.reader(f)
    data = (row for row in reader if 'Manager' in row[2])
    for entry in data:
        print(entry)

用例:

  • 快速过滤
  • 内存安全的管道

7. 轻松转义特殊字符

在写入包含逗号或引号的数据时,使用 quotechar 和 escapechar。

python 复制代码
with open('safe.csv', 'w', newline='') as f:
    writer = csv.writer(f, quoting=csv.QUOTE_MINIMAL, quotechar='"')
    writer.writerow(['John', 'He said, "Hello!"'])

为什么这很重要:

  • 确保与 Excel 和其他系统的兼容性
  • 防止文件损坏

8. 在不覆盖的情况下追加到现有 CSV 文件

有时,你希望向现有文件添加新数据。

python 复制代码
with open('log.csv', 'a', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['2025-05-28', 'Login', 'Success'])

最佳实践:

  • 始终以 mode='a' 和 newline='' 打开文件
  • 适用于日志系统或审计跟踪

9. 与 json 结合实现 CSV ↔ JSON 转换

你可以将 csv 与 json 结合起来轻松转换格式:

python 复制代码
import json
with open('data.csv') as f:
    reader = csv.DictReader(f)
    data = list(reader)
with open('data.json', 'w') as f:
    json.dump(data, f, indent=4)

好处:

  • 让数据更便于携带
  • 在 API 和 Web 应用中非常有用

10. 显式处理 Unicode 和编码

默认情况下,Python 使用系统编码。为了安全起见,最好明确指定编码:

python 复制代码
with open('data.csv', encoding='utf-8') as f:
    reader = csv.reader(f)

提示:

  • 在处理 Excel 文件时,使用 utf-8-sig
  • 防止字符损坏
相关推荐
XCDoris2 小时前
郴州logo设计机构
大数据·人工智能·python
gCode Teacher 格码致知2 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
马良神笔3 小时前
2026 年Rag最近技术前沿总结
后端·python·django
不像程序员的程序媛4 小时前
maven基础
python·pycharm·maven
xiaogai_gai5 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
benchmark_cc5 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu6 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
估值探索者6 小时前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口
田里的水稻7 小时前
PyTorch_Dataloader\TensorBoard---数据加载与可视化
人工智能·pytorch·python·神经网络·机器学习
Dmz丶7 小时前
前端转 AI 100 天 Day 27:Docker 容器化——从“我电脑能跑“到“到处能跑“
python