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
  • 防止字符损坏
相关推荐
站大爷IP7 分钟前
Python文本序列的类型
python
千千寰宇23 分钟前
[Java/Python] Java 基于命令行调用 Python
python·java se-jdk/jvm
yvestine1 小时前
自然语言处理——文本表示
人工智能·python·算法·自然语言处理·文本表示
zzc9211 小时前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab
编程有点难2 小时前
Python训练打卡Day43
开发语言·python·深度学习
2301_805054562 小时前
Python训练营打卡Day48(2025.6.8)
pytorch·python·深度学习
LjQ20402 小时前
网络爬虫一课一得
开发语言·数据库·python·网络爬虫
哆啦A梦的口袋呀2 小时前
基于Python学习《Head First设计模式》第九章 迭代器和组合模式
python·学习·设计模式
sponge'2 小时前
opencv学习笔记2:卷积、均值滤波、中值滤波
笔记·python·opencv·学习
databook3 小时前
概率图模型:机器学习的结构化概率之道
python·机器学习·scikit-learn