Python中的CSV文件处理
在数据处理和程序开发中,CSV(Comma-Separated Values,逗号分隔值)是一种非常常见且广泛使用的纯文本格式,用于存储表格数据。Python 提供了内置的 csv 模块作为标准库的一部分,专门用于读取和写入 CSV 文件,无需安装第三方库即可完成大多数常见的 CSV 操作。
一、什么是CSV文件?
CSV 文件是一种以纯文本形式存储表格数据的格式,每一行代表一条记录,字段之间通常使用逗号(,)分隔。例如:
姓名,年龄,城市
张三,25,北京
李四,30,上海
王五,28,广州
尽管名为“逗号分隔”,但实际中也可能使用其他分隔符(如制表符 或分号 ;),因此更广义地称为“分隔值文件”。
二、导入csv模块
Python 的 csv 模块是标准库的一部分,使用前只需简单导入:
import csv
三、读取CSV文件
1. 使用 csv.reader
csv.reader 用于读取 CSV 文件,返回一个可迭代对象,每一行是一个列表。
示例:读取普通CSV文件
import csv
with open('data.csv', mode='r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
for row in csv_reader:
print(row)
输出:
['姓名', '年龄', '城市']
['张三', '25', '北京']
['李四', '30', '上海']
['王五', '28', '广州']
注意:
row是一个字符串列表,所有数据均为字符串类型,如需数字需手动转换。
2. 处理不同分隔符
如果 CSV 文件使用其他分隔符(如分号或制表符),可以通过 delimiter 参数指定:
# 使用分号分隔
csv_reader = csv.reader(file, delimiter=';')
# 使用制表符分隔
csv_reader = csv.reader(file, delimiter=' ')
3. 使用 csv.DictReader(推荐)
csv.DictReader 将每行数据读取为字典,键为列名,值为对应字段内容,使代码更具可读性。
import csv
with open('data.csv', mode='r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
print(f"姓名: {row['姓名']}, 年龄: {row['年龄']}, 城市: {row['城市']}")
输出:
姓名: 张三, 年龄: 25, 城市: 北京
姓名: 李四, 年龄: 30, 城市: 上海
姓名: 王五, 年龄: 28, 城市: 广州
DictReader自动将第一行视为字段名(header)。若文件无标题行,可通过fieldnames参数手动指定。
四、写入CSV文件
1. 使用 csv.writer
csv.writer 用于将数据写入 CSV 文件。
示例:写入数据
import csv
data = [
['姓名', '年龄', '城市'],
['张三', 25, '北京'],
['李四', 30, '上海'],
['王五', 28, '广州']
]
with open('output.csv', mode='w', encoding='utf-8', newline='') as file:
csv_writer = csv.writer(file)
csv_writer.writerows(data) # 写入多行
注意:必须指定
newline='',否则在 Windows 系统下可能产生空行。
2. 使用 csv.DictWriter
当数据以字典形式组织时,使用 DictWriter 更加方便。
import csv
fieldnames = ['姓名', '年龄', '城市']
data = [
{'姓名': '张三', '年龄': 25, '城市': '北京'},
{'姓名': '李四', '年龄': 30, '城市': '上海'},
{'姓名': '王五', '年龄': 28, '城市': '广州'}
]
with open('output.csv', mode='w', encoding='utf-8', newline='') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader() # 写入标题行
writer.writerows(data) # 写入数据行
writeheader()方法会自动写入字段名作为第一行。
五、处理特殊情况
1. 处理包含逗号或引号的数据
CSV 模块会自动处理字段中包含逗号、换行符或引号的情况,只要数据被正确引用。
例如:
姓名,描述
Alice,"喜欢编程, 音乐和阅读"
Bob,"擅长Python, 数据分析"
csv.reader 会正确解析这些字段,不会因内部逗号而误切分。
2. 自定义Dialect
csv 模块支持自定义 Dialect,即一组预设的格式规则(如分隔符、引号规则等)。
class MyDialect(csv.Dialect):
delimiter = ';'
quotechar = '"'
quoting = csv.QUOTE_ALL
lineterminator = '
'
csv.register_dialect('mydialect', MyDialect)
# 使用自定义格式读取
with open('data.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file, dialect='mydialect')
六、错误处理与最佳实践
1. 添加异常处理
try:
with open('data.csv', mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
print(row)
except FileNotFoundError:
print("文件未找到!")
except Exception as e:
print(f"读取文件时出错: {e}")
2. 编码问题
中文数据建议使用 encoding='utf-8'。若遇到编码错误,可尝试 'utf-8-sig'(去除BOM头)或 'gbk'(适用于部分Windows生成的CSV)。
七、与其他工具的比较
| 工具 | 优点 | 缺点 |
|---|---|---|
csv 模块 | 标准库,轻量,无需依赖 | 功能较基础,处理大数据较慢 |
pandas | 功能强大,支持复杂操作 | 需额外安装,内存占用高 |
对于简单读写任务,csv 模块完全足够;若涉及数据分析、筛选、聚合等,推荐使用 pandas。
总结
Python 的 csv 模块是处理 CSV 文件的强大而简洁的工具。它提供了 reader、writer、DictReader 和 DictWriter 等接口,能够灵活应对各种 CSV 读写需求。掌握其基本用法,可以让你在数据导入导出、日志处理、配置文件管理等场景中游刃有余。
关键要点回顾:
- 使用
csv.reader逐行读取数据。 - 使用
csv.DictReader以字典方式访问字段。 - 写入时注意
newline=''和编码设置。 DictWriter更适合结构化数据写入。- 合理处理异常和编码问题。









