
如果你一直在使用 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
- 防止字符损坏