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
      • 示例:
        with open('example.csv', 'r', newline='') as f:
            reader = csv.DictReader(f)
            for row in reader:
                print(row['姓名'])  # 输出指定列的值
        
      • 适合按列名访问数据,特别在表头明确的情况下使用。
  2. 写入 CSV 文件

    • csv.writer(csvfile, dialect='excel', **fmtparams)
      • 返回一个 writer 对象,用于写入 CSV 数据。
      • 参数与 reader 类似,建议文件对象使用 newline='' 以避免 Windows 上的额外空行。
      • 方法:
        • writerow(row):写入一行数据。
        • writerows(rows):写入多行数据。
      • 示例:
        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):写入字典数据。
      • 示例:
        with open('output.csv', 'w', newline='') as f:
            fieldnames = ['姓名', '年龄']
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows([{'姓名': '张三', '年龄': 25}, {'姓名': '李四', '年龄': 30}])
        
      • 适合处理字典格式的数据,方便按键值对写入。
  3. 自定义 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
  4. 其他功能

    • 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.readercsv.writercsv.DictReadercsv.DictWriter,你可以轻松处理表格数据,实现数据导入导出和分析。无论是初学者还是有经验的开发者,csv 模块都是一个不可或缺的工具。


关键引文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI老李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值