掘金 人工智能 10月11日 03:35
Python csv模块:读写表格数据的实用指南
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了Python标准库中的csv模块,旨在帮助用户高效处理CSV格式的数据。文章从CSV的定义和常见应用场景入手,随后深入讲解了如何使用csv.writer和csv.DictWriter将内存中的列表或字典数据写入CSV文件,并提供了实例。接着,文章阐述了如何利用csv.reader和csv.DictReader将CSV文件读取回内存,并强调了读取数据默认是字符串需要类型转换。此外,还介绍了如何通过注册自定义方言(Dialect)来处理非标准分隔符和引号的CSV文件,以及如何使用csv.Sniffer自动检测CSV文件的格式。最后,通过一个完整的实战案例,演示了如何结合所学知识统计销售总额并生成汇总文件,帮助读者全面掌握csv模块的使用。

🗂️ **CSV格式基础与应用**:CSV(逗号分隔值)是一种简洁的纯文本表格格式,每行代表一条记录,字段间用分隔符(通常是逗号)隔开。其结构简单、体积小、兼容性强,广泛应用于Excel、数据库导入导出、机器学习数据集以及日志和爬虫数据的中间结果存储。Python的`csv`模块能方便地处理不同CSV“方言”的差异。

✍️ **写入CSV文件**:`csv`模块提供了`writer`和`DictWriter`两种写入方式。`writer`适用于将列表(如表头和数据行)直接写入文件,`writerows`可一次性写入多行。`DictWriter`则更智能,通过`fieldnames`指定字段名,能自动将字典数据写入,并可通过`writeheader()`写入表头,确保数据与字段名对应齐整。

📖 **读取CSV文件**:对应写入,`csv`模块提供了`reader`和`DictReader`用于读取。`reader`将每一行读取为字符串列表,需要手动进行类型转换。`DictReader`则以字典形式读取,将第一行作为键,后续行的数据以键值对的形式存储,方便按字段名访问数据。

🔧 **自定义与自动识别CSV格式**:当CSV文件的分隔符(如Tab、分号)或引号规则不标准时,可以通过`csv.register_dialect`注册自定义方言来处理。若不确定文件格式,`csv.Sniffer`可以根据文件样本自动推断出分隔符、引号等格式信息,使读取更加灵活便捷。

📈 **实战:统计销售总额**:通过结合读写操作,可以实现复杂的数据处理。例如,读取包含订单信息的CSV文件,计算每个订单的金额,累加得到总销售额,并将订单明细和总计结果写入一个新的CSV文件(如`summary.csv`),展示了`csv`模块在数据分析和报告生成中的实用价值。

前言

大家好,我是倔强青铜三。欢迎关注我,微信公众号:倔强青铜三。点赞、收藏、关注,一键三连!

欢迎来到苦练Python第62天

今天我们来学习Python标准库中的csv模块。

一、CSV 是什么?能做什么?

CSV(Comma-Separated Values,逗号分隔值)是一种纯文本表格格式。

常见场景

    Excel / WPS / Google Sheets 导出或导入数据MySQL、PostgreSQL 等数据库批量导入导出机器学习数据集(如 Kaggle 的 .csv 文件)日志、传感器、爬虫抓取的中间结果

Python 自带的 csv 模块(import csv)让我们不用关心各种方言差异,就能安全地读写 CSV。


二、写 CSV —— 把内存数据变成文件

2.1 用列表写入:writer.writerow / writer.writerows

# 示例:把成绩表写入 scores.csvimport csvheader = ['姓名', '语文', '数学', '英语']rows = [    ['张三', 90, 85, 88],    ['李四', 78, 92, 87],    ['王五', 95, 91, 93]]with open('scores.csv', 'w', newline='', encoding='utf-8') as f:    writer = csv.writer(f)    writer.writerow(header)    # 写表头    writer.writerows(rows)     # 写多行

运行后得到文件 scores.csv

姓名,语文,数学,英语张三,90,85,88李四,78,92,87王五,95,91,93

2.2 用字典写入:DictWriter(自动对齐字段)

# 示例:把订单写入 orders.csvimport csvfieldnames = ['订单号', '商品', '单价', '数量']orders = [    {'订单号': 1001, '商品': 'Python 入门', '单价': 59, '数量': 2},    {'订单号': 1002, '商品': 'Python 进阶', '单价': 79, '数量': 1}]with open('orders.csv', 'w', newline='', encoding='utf-8') as f:    writer = csv.DictWriter(f, fieldnames=fieldnames)    writer.writeheader()    writer.writerows(orders)

文件内容:

订单号,商品,单价,数量1001,Python 入门,59,21002,Python 进阶,79,1

三、读 CSV —— 把文件读回内存

3.1 按列表读取:csv.reader

# 读取刚才生成的 scores.csvimport csvwith open('scores.csv', newline='', encoding='utf-8') as f:    reader = csv.reader(f)    for row in reader:        print(row)

输出:

['姓名', '语文', '数学', '英语']['张三', '90', '85', '88']['李四', '78', '92', '87']['王五', '95', '91', '93']

注意:读出来默认是字符串,需要自行转换类型。


3.2 按字典读取:csv.DictReader(字段名做键)

# 读取 orders.csvimport csvwith open('orders.csv', newline='', encoding='utf-8') as f:    reader = csv.DictReader(f)    for row in reader:        print(row['商品'], '共', int(row['数量']) * int(row['单价']), '元')

输出:

Python 入门 共 118 元Python 进阶 共 79 元

四、自定义方言:处理“奇怪”的 CSV

有时分隔符不是逗号,而是 Tab、分号,甚至管道符 |;或者字段里本身包含分隔符,需要特殊引号。
通过 csv.register_dialect 可以“注册”一种新方言,后续直接引用名字即可。

# 写入以分号分隔、单引号包围的 csvimport csvcsv.register_dialect('semicolon', delimiter=';', quotechar="'", quoting=csv.QUOTE_MINIMAL)data = [["Tom;Jerry", 100], ["Spike", 90]]with open('pets.csv', 'w', newline='') as f:    writer = csv.writer(f, dialect='semicolon')    writer.writerow(['主人', '分数'])    writer.writerows(data)# 读取同样使用方言with open('pets.csv', newline='') as f:    reader = csv.reader(f, dialect='semicolon')    for row in reader:        print(row)

输出:

['主人', '分数']["Tom;Jerry", '100']['Spike', '90']

五、自动检测方言:Sniffer 一键猜格式

拿到一个未知格式的 CSV,可以用 csv.Sniffer 自动推断分隔符、引号规则。

# 假设我们拿到 example.csv,但不知道分隔符import csvraw = '''name|age|cityAlice|30|BeijingBob|25|Shanghai'''with open('example.csv', 'w', encoding='utf-8') as f:    f.write(raw)with open('example.csv', newline='') as f:    sample = f.read(1024)    f.seek(0)    dialect = csv.Sniffer().sniff(sample, delimiters='|,\t;')    reader = csv.reader(f, dialect=dialect)    for row in reader:        print(row)

输出:

['name', 'age', 'city']['Alice', '30', 'Beijing']['Bob', '25', 'Shanghai']

六、完整实战:统计销售总额

把上面所有知识点串起来——

    读入 orders.csv计算每个订单金额把结果写入 summary.csv
import csv# 1. 读total = 0summary_rows = []with open('orders.csv', newline='', encoding='utf-8') as f:    reader = csv.DictReader(f)    for row in reader:        price = int(row['单价'])        qty   = int(row['数量'])        sub   = price * qty        total += sub        summary_rows.append([row['订单号'], row['商品'], sub])# 2. 写with open('summary.csv', 'w', newline='', encoding='utf-8') as f:    writer = csv.writer(f)    writer.writerow(['订单号', '商品', '金额'])    writer.writerows(summary_rows)    writer.writerow(['', '总计', total])print('已生成 summary.csv,总销售额:', total)

运行后 summary.csv

订单号,商品,金额1001,Python 入门,1181002,Python 进阶,79,总计,197

七、小结与下一步

最后感谢阅读!欢迎关注我,微信公众号:倔强青铜三
欢迎点赞、收藏、关注,一键三连!!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Python csv模块 数据处理 文件读写 Python教程 csv module data processing file I/O Python tutorial
相关文章