前言
大家好,我是倔强青铜三。欢迎关注我,微信公众号:倔强青铜三。点赞、收藏、关注,一键三连!
欢迎来到苦练Python第62天!
今天我们来学习Python标准库中的csv模块。
一、CSV 是什么?能做什么?
CSV(Comma-Separated Values,逗号分隔值)是一种纯文本表格格式。
- 每行是一条记录(record),行内每个字段(field)用分隔符(通常是逗号)隔开。
- 结构简单、体积小、兼容性强,几乎所有电子表格、数据库、数据分析工具都支持。
常见场景
- Excel / WPS / Google Sheets 导出或导入数据
- MySQL、PostgreSQL 等数据库批量导入导出
- 机器学习数据集(如 Kaggle 的
.csv文件) - 日志、传感器、爬虫抓取的中间结果
Python 自带的 csv 模块(import csv)让我们不用关心各种方言差异,就能安全地读写 CSV。
二、写 CSV —— 把内存数据变成文件
2.1 用列表写入:writer.writerow / writer.writerows
1# 示例:把成绩表写入 scores.csv 2import csv 3 4header = ['姓名', '语文', '数学', '英语'] 5rows = [ 6 ['张三', 90, 85, 88], 7 ['李四', 78, 92, 87], 8 ['王五', 95, 91, 93] 9] 10 11with open('scores.csv', 'w', newline='', encoding='utf-8') as f: 12 writer = csv.writer(f) 13 writer.writerow(header) # 写表头 14 writer.writerows(rows) # 写多行 15
运行后得到文件 scores.csv:
1姓名,语文,数学,英语 2张三,90,85,88 3李四,78,92,87 4王五,95,91,93 5
2.2 用字典写入:DictWriter(自动对齐字段)
1# 示例:把订单写入 orders.csv 2import csv 3 4fieldnames = ['订单号', '商品', '单价', '数量'] 5orders = [ 6 {'订单号': 1001, '商品': 'Python 入门', '单价': 59, '数量': 2}, 7 {'订单号': 1002, '商品': 'Python 进阶', '单价': 79, '数量': 1} 8] 9 10with open('orders.csv', 'w', newline='', encoding='utf-8') as f: 11 writer = csv.DictWriter(f, fieldnames=fieldnames) 12 writer.writeheader() 13 writer.writerows(orders) 14
文件内容:
1订单号,商品,单价,数量 21001,Python 入门,59,2 31002,Python 进阶,79,1 4
三、读 CSV —— 把文件读回内存
3.1 按列表读取:csv.reader
1# 读取刚才生成的 scores.csv 2import csv 3 4with open('scores.csv', newline='', encoding='utf-8') as f: 5 reader = csv.reader(f) 6 for row in reader: 7 print(row) 8
输出:
1['姓名', '语文', '数学', '英语'] 2['张三', '90', '85', '88'] 3['李四', '78', '92', '87'] 4['王五', '95', '91', '93'] 5
注意:读出来默认是字符串,需要自行转换类型。
3.2 按字典读取:csv.DictReader(字段名做键)
1# 读取 orders.csv 2import csv 3 4with open('orders.csv', newline='', encoding='utf-8') as f: 5 reader = csv.DictReader(f) 6 for row in reader: 7 print(row['商品'], '共', int(row['数量']) * int(row['单价']), '元') 8
输出:
1Python 入门 共 118 元 2Python 进阶 共 79 元 3
四、自定义方言:处理“奇怪”的 CSV
有时分隔符不是逗号,而是 Tab、分号,甚至管道符 |;或者字段里本身包含分隔符,需要特殊引号。
通过 csv.register_dialect 可以“注册”一种新方言,后续直接引用名字即可。
1# 写入以分号分隔、单引号包围的 csv 2import csv 3 4csv.register_dialect('semicolon', delimiter=';', quotechar="'", quoting=csv.QUOTE_MINIMAL) 5 6data = [["Tom;Jerry", 100], ["Spike", 90]] 7 8with open('pets.csv', 'w', newline='') as f: 9 writer = csv.writer(f, dialect='semicolon') 10 writer.writerow(['主人', '分数']) 11 writer.writerows(data) 12 13# 读取同样使用方言 14with open('pets.csv', newline='') as f: 15 reader = csv.reader(f, dialect='semicolon') 16 for row in reader: 17 print(row) 18
输出:
1['主人', '分数'] 2["Tom;Jerry", '100'] 3['Spike', '90'] 4
五、自动检测方言:Sniffer 一键猜格式
拿到一个未知格式的 CSV,可以用 csv.Sniffer 自动推断分隔符、引号规则。
1# 假设我们拿到 example.csv,但不知道分隔符 2import csv 3 4raw = '''name|age|city 5Alice|30|Beijing 6Bob|25|Shanghai''' 7 8with open('example.csv', 'w', encoding='utf-8') as f: 9 f.write(raw) 10 11with open('example.csv', newline='') as f: 12 sample = f.read(1024) 13 f.seek(0) 14 dialect = csv.Sniffer().sniff(sample, delimiters='|,\t;') 15 reader = csv.reader(f, dialect=dialect) 16 for row in reader: 17 print(row) 18
输出:
1['name', 'age', 'city'] 2['Alice', '30', 'Beijing'] 3['Bob', '25', 'Shanghai'] 4
六、完整实战:统计销售总额
把上面所有知识点串起来——
- 读入
orders.csv - 计算每个订单金额
- 把结果写入
summary.csv
1import csv 2 3# 1. 读 4total = 0 5summary_rows = [] 6 7with open('orders.csv', newline='', encoding='utf-8') as f: 8 reader = csv.DictReader(f) 9 for row in reader: 10 price = int(row['单价']) 11 qty = int(row['数量']) 12 sub = price * qty 13 total += sub 14 summary_rows.append([row['订单号'], row['商品'], sub]) 15 16# 2. 写 17with open('summary.csv', 'w', newline='', encoding='utf-8') as f: 18 writer = csv.writer(f) 19 writer.writerow(['订单号', '商品', '金额']) 20 writer.writerows(summary_rows) 21 writer.writerow(['', '总计', total]) 22 23print('已生成 summary.csv,总销售额:', total) 24
运行后 summary.csv:
1订单号,商品,金额 21001,Python 入门,118 31002,Python 进阶,79 4,总计,197 5
七、小结与下一步
- csv.writer / csv.DictWriter:把列表或字典写文件
- csv.reader / csv.DictReader:把文件读回列表或字典
- Dialect / Sniffer:处理各种分隔符、引号、转义规则
最后感谢阅读!欢迎关注我,微信公众号:
倔强青铜三。
欢迎点赞、收藏、关注,一键三连!!
《苦练Python第62天:零基础玩转CSV文件读写,csv模块实战》 是转载文章,点击查看原文。

