Python 处理 CSV 入门:带逗号的字段为何不能直接 split?
收到一份表格导出的 CSV 文件时,初学者可能会用逗号把每一行直接拆开。但如果某个字段本身包含逗号,结果就会错位。Python 的 csv 标准库可以处理常见的分隔符和引号规则,适合用来完成小型数据整理。
一、准备一份示例数据
在练习目录中新建 UTF-8 编码的 tasks.csv,内容如下:
name,team,hours
整理文档,"开发,测试",2
检查日志,运维,3
更新配置,开发,1
第二行的团队名称用双引号包住,里面的逗号属于字段内容。如果对整行使用 split(','),这个字段会被误拆成两段。CSV 中的引号还有转义规则,因此不要自己拼接或拆分复杂字段。
二、按表头读取数据
在同一目录创建 read_tasks.py:
import csv
with open('tasks.csv', encoding='utf-8', newline='') as source:
reader = csv.DictReader(source)
for row in reader:
print(row['name'], row['team'], row['hours'])
运行 python read_tasks.py,第一条数据中的团队应显示为“开发,测试”。没有指定字段名时,DictReader 使用首行作为表头,后续每行可以按列名取值。打开 CSV 文件时设置 newline='',让 csv 模块处理换行细节。
三、筛选并写到新文件
下面把工时不少于 2 的记录写入另一个文件,保留原始数据:
import csv
with open('tasks.csv', encoding='utf-8', newline='') as source:
rows = list(csv.DictReader(source))
with open('selected.csv', 'w', encoding='utf-8', newline='') as target:
writer = csv.DictWriter(target, fieldnames=['name', 'team', 'hours'])
writer.writeheader()
for row in rows:
if int(row['hours']) >= 2:
writer.writerow(row)
运行后,结果应包含表头和前两条记录。写入器会处理示例中字段内的逗号,不必手动加引号。注意 w 模式会覆盖同名输出文件,运行前请确认输出路径。
四、处理真实数据时先检查边界
示例中的 hours 都是整数文本;默认读取结果是字符串,参与数值比较前需要转换。真实文件可能有空值、非数字或缺列,直接转换会报错,应该按业务规则记录问题行或提示用户,而不是悄悄当作零。
如果列名对不上,先检查表头的空格、大小写和编码。遇到带 UTF-8 BOM 的文件,可尝试读取时使用 utf-8-sig;其他编码应先确认来源。数据量很大时,也可逐行处理,避免像示例一样把所有记录存入内存。
先用几行包含逗号和空值的样本验证,再处理完整文件,并核对输出行数。这样既能发现格式问题,也更容易保护原始数据。
- 点赞
- 收藏
- 关注作者
评论(0)