Python3 csv 模块

CSV(逗号分隔值)是数据处理中最常用的文本格式之一,小到日志导出、大到批量数据交换,都能见到它的身影。Python3 内置的 csv 模块无需额外安装,专门用于处理 CSV 文件的读写、解析与格式化,相比手动拆分字符串,它能优雅处理分隔符、引号嵌套、换行符等边缘场景,是处理 CSV 数据的首选工具。

一、核心优势:为何不用手动处理?

手动通过 split(',') 处理 CSV 存在诸多问题:
 
  • 字段包含逗号(如 "张三,男,25")时,拆分结果错误;
  • 字段含换行符、引号时,手动处理易出错;
  • 不同系统的换行符(\n/\r\n)、编码差异需额外兼容。
 
而 csv 模块原生解决以上问题,支持自定义分隔符、引号规则,适配多编码格式,且内存友好,适合处理大文件。

二、基础用法:核心对象与读写操作

csv 模块的核心是 4 个基础对象:reader(读取)、writer(写入)、DictReader(字典形式读取)、DictWriter(字典形式写入),以下是最常用的基础操作。

1. 基础读取:csv.reader

适用于无表头 / 仅需按列索引读取的 CSV 文件,返回可迭代的行对象(每行是字符串列表)。

示例:读取本地 CSV 文件

假设有 user.csv 文件内容如下:
姓名,年龄,城市
张三,25,北京
李四,30,上海
王五,28,广州
 
 
读取代码:
 
import csv

# 打开文件时指定编码(建议utf-8),newline=''避免空行
with open('user.csv', 'r', encoding='utf-8', newline='') as f:
    # 创建reader对象
    csv_reader = csv.reader(f)
    # 跳过表头(如需读取表头可直接next(csv_reader))
    header = next(csv_reader)
    print("表头:", header)
    
    # 遍历读取每一行
    for row in csv_reader:
        name = row[0]  # 第1列:姓名
        age = int(row[1])  # 第2列:年龄(转换为整数)
        city = row[2]  # 第3列:城市
        print(f"姓名:{name},年龄:{age},城市:{city}")
 
 
输出结果:
 
表头: ['姓名', '年龄', '城市']
姓名:张三,年龄:25,城市:北京
姓名:李四,年龄:30,城市:上海
姓名:王五,年龄:28,城市:广州
 

2. 基础写入:csv.writer

用于将数据写入 CSV 文件,支持自定义分隔符、引号规则。

示例:写入数据到 CSV 文件 

import csv

# 待写入的数据(表头+行数据)
data = [
    ['姓名', '年龄', '城市'],
    ['赵六', 32, '深圳'],
    ['钱七', 27, '杭州']
]

# 写入文件,newline=''避免行尾空行
with open('new_user.csv', 'w', encoding='utf-8', newline='') as f:
    # 创建writer对象,delimiter指定分隔符(默认逗号)
    csv_writer = csv.writer(f, delimiter=',')
    # 批量写入(也可用writerow逐行写入)
    csv_writer.writerows(data)
    # 单行写入示例:csv_writer.writerow(['孙八', 29, '成都'])
 
 
生成的 new_user.csv 内容:
 
姓名,年龄,城市
赵六,32,深圳
钱七,27,杭州
 

三、进阶用法:字典形式读写(更易用)

DictReader/DictWriter 以字典形式处理 CSV,无需记列索引,直接通过表头名访问字段,适合有表头的场景。

1. DictReader:按表头读取 

import csv

with open('user.csv', 'r', encoding='utf-8', newline='') as f:
    # 创建DictReader对象,自动将第一行作为表头(key)
    csv_dict_reader = csv.DictReader(f)
    # 遍历每行(每行是字典,key为表头,value为字段值)
    for row in csv_dict_reader:
        name = row['姓名']
        age = int(row['年龄'])
        city = row['城市']
        print(f"【字典读取】姓名:{name},年龄:{age},城市:{city}")
 

2. DictWriter:按表头写入 

import csv

# 定义表头(必须指定,否则写入失败)
fieldnames = ['姓名', '年龄', '城市']
# 待写入的字典数据
data = [
    {'姓名': '周九', '年龄': 35, '城市': '重庆'},
    {'姓名': '吴十', '年龄': 26, '城市': '南京'}
]

with open('dict_user.csv', 'w', encoding='utf-8', newline='') as f:
    # 创建DictWriter对象,指定表头
    csv_dict_writer = csv.DictWriter(f, fieldnames=fieldnames)
    # 先写入表头(必须先写,否则只有数据无表头)
    csv_dict_writer.writeheader()
    # 批量写入字典数据
    csv_dict_writer.writerows(data)
 

四、实战场景:解决常见问题

1. 自定义分隔符(如制表符、分号)

部分 CSV 文件用制表符(\t)或分号(;)分隔,需指定 delimiter: 
 
# 读取分号分隔的CSV
with open('semicolon.csv', 'r', encoding='utf-8', newline='') as f:
    csv_reader = csv.reader(f, delimiter=';')
    for row in csv_reader:
        print(row)
 

2. 处理含引号 / 换行符的特殊字段

csv 模块自动处理引号嵌套,无需手动转义: 
import csv

# 含引号、换行符的特殊数据
data = [
    ['商品名', '描述', '价格'],
    ['"手机"', '大屏\n超长续航', 2999],
    ['笔记本电脑', '16G内存;512G硬盘', 5999]
]

with open('product.csv', 'w', encoding='utf-8', newline='') as f:
    csv_writer = csv.writer(f, quoting=csv.QUOTE_ALL)  # 所有字段加引号
    csv_writer.writerows(data)
 

3. 筛选 CSV 数据(按条件过滤)

示例:筛选出年龄≥30 的用户并写入新文件: 
 
import csv

with open('user.csv', 'r', encoding='utf-8', newline='') as f_read, \
     open('filter_user.csv', 'w', encoding='utf-8', newline='') as f_write:
    # 读取源文件
    reader = csv.DictReader(f_read)
    # 写入目标文件(复用源表头)
    writer = csv.DictWriter(f_write, fieldnames=reader.fieldnames)
    writer.writeheader()
    
    # 筛选年龄≥30的行
    for row in reader:
        if int(row['年龄']) >= 30:
            writer.writerow(row)
 

4. 处理超大 CSV 文件(逐行读取避免内存溢出)

对于 GB 级超大 CSV,切勿一次性读取所有行,需逐行处理: 
import csv

with open('big_data.csv', 'r', encoding='utf-8', newline='') as f:
    csv_reader = csv.reader(f)
    header = next(csv_reader)  # 读取表头
    for row in csv_reader:
        # 逐行处理(如写入数据库、计算统计值等)
        pass
 

五、常见坑与避坑指南

  1. 空行问题:写入时必须指定 newline='',否则 Windows 系统会每行末尾多出空行;
  2. 编码问题:读取 / 写入时明确指定编码(如 utf-8),避免中文乱码(若文件是 GBK 编码,需改为 encoding='gbk');
  3. 引号规则:默认仅含特殊字符(逗号、换行)的字段加引号,可通过 quoting 参数控制:
    • csv.QUOTE_ALL:所有字段加引号;
    • csv.QUOTE_MINIMAL:仅特殊字段加引号(默认);
    • csv.QUOTE_NONE:不加引号(需手动处理分隔符冲突);
  4. 表头缺失DictWriter 必须指定 fieldnames 且先调用 writeheader(),否则无表头;
  5. 数据类型csv 模块读取的所有字段默认是字符串,需手动转换为 int/float 等类型。

六、总结

Python3 csv 模块是处理 CSV 数据的轻量且高效的工具:
 
  • 基础场景用 reader/writer,适合无表头或简单读写;
  • 复杂场景用 DictReader/DictWriter,按表头操作更易维护;
  • 处理特殊格式(分隔符、引号)、超大文件时,利用模块内置参数规避坑点。
 
相比 pandas 等第三方库,csv 模块无需依赖,启动快、内存占用低,是小文件 / 简单场景的最优选择;若需复杂数据分析(如透视表、批量计算),可结合 pandas 进一步处理。

posted on 2025-12-16 16:43  小陶coding  阅读(4)  评论(0)    收藏  举报