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. 轻松转义特殊字符

在写入包含逗号或引号的数据时,使用 quotecharescapechar

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 转换

你可以将 csvjson 结合起来轻松转换格式:

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
  • 防止字符损坏
相关推荐
葱明撅腚10 分钟前
利用Python挖掘城市数据
python·算法·gis·聚类
Serendipity_Carl17 分钟前
1637加盟网数据实战(数分可视化)
爬虫·python·pycharm·数据可视化·数据清洗
流㶡19 分钟前
网络爬虫之requests.get() 之爬取网页内容
python·数据爬虫
yuankoudaodaokou29 分钟前
高校科研新利器:思看科技三维扫描仪助力精密研究
人工智能·python·科技
言無咎1 小时前
从规则引擎到任务规划:AI Agent 重构跨境财税复杂账务处理体系
大数据·人工智能·python·重构
张小凡vip1 小时前
数据挖掘(十)---python操作Spark常用命令
python·数据挖掘·spark
U盘失踪了1 小时前
Reqable 导出响应数据
python
2301_790300961 小时前
数据分析与科学计算
jvm·数据库·python
程序员小远1 小时前
使用Postman进行一次完整的接口测试
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
Yvonne爱编码1 小时前
JAVA数据结构 DAY1-集合和时空复杂度
java·数据结构·python