Python csv 模块


关键要点

  • Python 的 csv 模块用于读写 CSV 文件,适合处理表格数据。
  • 它支持自定义分隔符和引号,处理复杂格式。
  • 主要功能包括 csv.readercsv.writercsv.DictReadercsv.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 模块提供了以下核心类和函数,涵盖了读取、写入和格式自定义的需求:

  1. 读取 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['姓名']) # 输出指定列的值
    • 适合按列名访问数据,特别在表头明确的情况下使用。
  1. 写入 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}])
    • 适合处理字典格式的数据,方便按键值对写入。
  1. 自定义 CSV 格式
  • csv 模块支持通过 Dialect 类和格式参数自定义 CSV 格式,适应不同分隔符、引号和换行符。
  • 常用属性:
    • delimiter:分隔符,默认 ','
    • quotechar:引号字符,默认 '"'
    • quoting:引号策略,默认 QUOTE_MINIMAL,其他选项包括 QUOTE_ALL(所有字段加引号)、QUOTE_NONNUMERIC(非数字字段加引号)、QUOTE_NONE(不加引号)。
    • 版本 3.11 变更:escapecharquotechar 不能为空。
  • 示例: 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_NOTNULLQUOTE_STRINGS
  1. 其他功能
  • 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 和 DictWriterPython处理csv文件

这些资源提供了从基础到高级的全面指导,适合不同水平的学习者。

注意事项

在使用 csv 模块时,需要注意以下几点:

  • 确保使用 Python 3.5 或更高版本,以充分利用现代特性。
  • 避免直接操作文件内容(如手动 split(',')),以正确处理带引号的字段。
  • 对于实际开发,建议结合其他库(如 Pandas)扩展功能,特别是在处理大型数据集时。

结论

截至 2025 年 6 月 4 日,Python 的 csv 模块是处理 CSV 文件的强大工具,支持灵活的读写操作和自定义格式。通过使用 csv.readercsv.writercsv.DictReadercsv.DictWriter,你可以轻松处理表格数据,实现数据导入导出和分析。无论是初学者还是有经验的开发者,csv 模块都是一个不可或缺的工具。



发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注