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
五、常见坑与避坑指南
- 空行问题:写入时必须指定
newline='',否则 Windows 系统会每行末尾多出空行; - 编码问题:读取 / 写入时明确指定编码(如
utf-8),避免中文乱码(若文件是 GBK 编码,需改为encoding='gbk'); - 引号规则:默认仅含特殊字符(逗号、换行)的字段加引号,可通过
quoting参数控制:csv.QUOTE_ALL:所有字段加引号;csv.QUOTE_MINIMAL:仅特殊字段加引号(默认);csv.QUOTE_NONE:不加引号(需手动处理分隔符冲突);
- 表头缺失:
DictWriter必须指定fieldnames且先调用writeheader(),否则无表头; - 数据类型:
csv模块读取的所有字段默认是字符串,需手动转换为 int/float 等类型。
六、总结
Python3
csv 模块是处理 CSV 数据的轻量且高效的工具:- 基础场景用
reader/writer,适合无表头或简单读写; - 复杂场景用
DictReader/DictWriter,按表头操作更易维护; - 处理特殊格式(分隔符、引号)、超大文件时,利用模块内置参数规避坑点。
相比 pandas 等第三方库,
csv 模块无需依赖,启动快、内存占用低,是小文件 / 简单场景的最优选择;若需复杂数据分析(如透视表、批量计算),可结合 pandas 进一步处理。
浙公网安备 33010602011771号