关键要点
- Python 的
csv
模块用于读写 CSV 文件,适合处理表格数据。 - 它支持自定义分隔符和引号,处理复杂格式。
- 主要功能包括
csv.reader
、csv.writer
、csv.DictReader
和csv.DictWriter
。 - 使用时注意文件编码和
newline=''
参数,避免额外空行。
模块简介
Python 的 csv
模块是标准库的一部分,帮助你读取和写入 CSV 文件。CSV 是一种常见的文本格式,用于存储表格数据,如电子表格或数据库导出。它支持处理包含逗号、换行符或引号的复杂字段,适合数据分析和跨平台数据交换。
如何使用
- 读取文件:用
csv.reader
读取数据为列表,或用csv.DictReader
读取为字典,方便按列名访问。 - 写入文件:用
csv.writer
写入数据,注意用newline=''
避免 Windows 上的额外空行;csv.DictWriter
支持按字典写入。 - 自定义格式:可以设置分隔符(如逗号或制表符)和引号样式,适应不同 CSV 文件。
示例
以下是读取和写入 CSV 文件的简单示例:
import csv
# 读取
with open('example.csv', 'r', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 写入
with open('output.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['姓名', '年龄'])
writer.writerows([['张三', 25], ['李四', 30]])
Python csv 模块详细说明(截至 2025 年 6 月 4 日)
背景与概述
CSV(Comma-Separated Values,逗号分隔值)是一种通用的文本格式,用于存储表格数据,包括数字和字符。它广泛应用于电子表格(如 Excel)、数据库导出和数据分析场景。由于 CSV 没有统一的国际标准,不同应用程序的实现可能存在细微差异,这使得处理多个来源的 CSV 文件变得复杂。Python 的 csv
模块自 Python 2.3 起成为标准库的一部分,提供了可靠的工具来读取和写入 CSV 文件,解放程序员从繁琐的解析细节中。
根据官方文档(csv — CSV 文件读写 — Python 3.13.3 文档),csv
模块实现了 RFC 4180 标准,支持与 Excel 兼容的格式,并允许自定义 CSV 方言(dialect),以适应特定需求。它特别适合数据导入导出、数据预处理和与其他工具(如 Pandas)交互。
核心功能与使用方法
csv
模块提供了以下核心类和函数,涵盖了读取、写入和格式自定义的需求:
- 读取 CSV 文件:
csv.reader(csvfile, dialect='excel', **fmtparams)
:- 返回一个 reader 对象,用于逐行读取 CSV 文件。
- 参数:
csvfile
:一个可迭代对象,通常是文件对象,建议使用open()
打开,设置newline=''
以避免平台相关的换行问题。dialect
:指定 CSV 方言,默认为'excel'
。**fmtparams
:格式参数,如delimiter
(分隔符,默认','
)、quotechar
(引号字符,默认'"'
)。- 示例:
import csv with open('example.csv', 'r', newline='') as f: reader = csv.reader(f) for row in reader: print(row) # 输出每行数据,如 ['姓名', '年龄']
- 每次迭代返回一个列表,代表一行数据。
reader.line_num
属性可以获取当前行号(从 1 开始)。
csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
:- 返回一个 reader 对象,每个元素是一个字典,键为列名(默认使用文件第一行作为键)。
- 参数:
fieldnames
:可选,指定列名列表,如果未提供,则使用第一行数据。restkey
:未匹配的键名,默认为None
。restval
:未匹配的值,默认为None
。- 版本变化:
- Python 3.6:返回
OrderedDict
。 - Python 3.8:返回
dict
。 - 示例:
python with open('example.csv', 'r', newline='') as f: reader = csv.DictReader(f) for row in reader: print(row['姓名']) # 输出指定列的值
- 适合按列名访问数据,特别在表头明确的情况下使用。
- 写入 CSV 文件:
csv.writer(csvfile, dialect='excel', **fmtparams)
:- 返回一个 writer 对象,用于写入 CSV 数据。
- 参数与
reader
类似,建议文件对象使用newline=''
以避免 Windows 上的额外空行。 - 方法:
writerow(row)
:写入一行数据。writerows(rows)
:写入多行数据。- 示例:
python with open('output.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['姓名', '年龄']) # 写入表头 writer.writerows([['张三', 25], ['李四', 30]]) # 写入数据
csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
:- 返回一个 writer 对象,用于将字典数据写入 CSV 文件。
- 参数:
fieldnames
:必需,指定列名列表。restval
:未匹配键的值,默认为空字符串。extrasaction
:处理多余键的策略,'raise'
(默认,抛出错误)或'ignore'
(忽略)。- 方法:
writeheader()
:写入表头。writerow(row)
或writerows(rows)
:写入字典数据。- 示例:
python with open('output.csv', 'w', newline='') as f: fieldnames = ['姓名', '年龄'] writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() writer.writerows([{'姓名': '张三', '年龄': 25}, {'姓名': '李四', '年龄': 30}])
- 适合处理字典格式的数据,方便按键值对写入。
- 自定义 CSV 格式:
csv
模块支持通过Dialect
类和格式参数自定义 CSV 格式,适应不同分隔符、引号和换行符。- 常用属性:
delimiter
:分隔符,默认','
。quotechar
:引号字符,默认'"'
。quoting
:引号策略,默认QUOTE_MINIMAL
,其他选项包括QUOTE_ALL
(所有字段加引号)、QUOTE_NONNUMERIC
(非数字字段加引号)、QUOTE_NONE
(不加引号)。- 版本 3.11 变更:
escapechar
和quotechar
不能为空。
- 示例:
import csv # 注册自定义方言 csv.register_dialect('mydialect', delimiter='|', quoting=csv.QUOTE_ALL) # 使用自定义方言读取文件 with open('example.csv', 'r', newline='') as f: reader = csv.reader(f, dialect='mydialect') for row in reader: print(row)
- 常量:
QUOTE_ALL
:所有字段加引号。QUOTE_MINIMAL
:仅在必要时加引号(如包含分隔符)。QUOTE_NONNUMERIC
:非数字字段加引号。QUOTE_NONE
:不加引号。- Python 3.12 新增:
QUOTE_NOTNULL
和QUOTE_STRINGS
。
- 其他功能:
csv.field_size_limit([limit])
:设置或获取字段大小限制。csv.get_dialect(name)
:获取已注册的方言。csv.list_dialects()
:列出所有已注册的方言。- 示例输出:
list_dialects()
返回['excel-tab', 'excel', 'mydialect']
。
使用场景与最佳实践
csv
模块适合以下场景:
- 数据分析:读取 CSV 文件进行数据预处理。
- 数据迁移:将数据从数据库导出为 CSV,或从 CSV 导入数据库。
- 跨平台数据交换:与 Excel、Pandas 等工具交互。
最佳实践包括:
- 文件编码:如果 CSV 文件包含非 ASCII 字符,建议使用
encoding='utf-8'
,如open('example.csv', 'r', newline='', encoding='utf-8')
。 - 错误处理:
csv
模块可能会抛出csv.Error
异常,建议使用try-except
块处理。 - 性能优化:对于大型文件,考虑使用生成器或 Pandas 库(如
pd.read_csv()
)以提高效率。
对比分析:csv 模块与 Pandas
以下表格比较 csv
模块与 Pandas 处理 CSV 文件的差异:
方面 | csv 模块 | Pandas |
---|---|---|
功能 | 基础读写,支持自定义格式 | 高级数据处理,内置数据分析功能 |
易用性 | 适合简单任务,需手动处理数据结构 | 提供 DataFrame,数据操作更直观 |
性能 | 适合小型文件,读取写入效率高 | 适合大型文件,优化了内存使用 |
使用场景 | 数据导入导出,简单解析 | 数据分析、可视化、复杂数据处理 |
依赖 | 无额外依赖,标准库 | 需要安装,依赖 NumPy 等库 |
学习资源
以下是推荐的中文学习资源,涵盖了从基础概念到高级应用的全面内容:
资源类型 | 标题 | 特点 | URL |
---|---|---|---|
官方文档 | csv — CSV 文件读写 — Python 3.13.3 文档 | 权威、全面,适合参考 | csv — CSV 文件读写 — Python 3.13.3 文档 |
博客文章 | 【Python】 csv模块的使用 | 详细示例,适合初学者 | 【Python】 csv模块的使用 |
博客文章 | Python处理csv文件 | 实践导向,包含 DictReader 和 DictWriter | Python处理csv文件 |
这些资源提供了从基础到高级的全面指导,适合不同水平的学习者。
注意事项
在使用 csv
模块时,需要注意以下几点:
- 确保使用 Python 3.5 或更高版本,以充分利用现代特性。
- 避免直接操作文件内容(如手动
split(',')
),以正确处理带引号的字段。 - 对于实际开发,建议结合其他库(如 Pandas)扩展功能,特别是在处理大型数据集时。
结论
截至 2025 年 6 月 4 日,Python 的 csv
模块是处理 CSV 文件的强大工具,支持灵活的读写操作和自定义格式。通过使用 csv.reader
、csv.writer
、csv.DictReader
和 csv.DictWriter
,你可以轻松处理表格数据,实现数据导入导出和分析。无论是初学者还是有经验的开发者,csv
模块都是一个不可或缺的工具。