Python处理excel数据,原来这么简单,VBA要尴尬了

本文介绍了如何使用Python高效处理Excel数据,对比VBA的局限性,推荐使用openpyxl库,详细解释了xlrd、xlwt、xlutils库的功能和用法,并展示了openpyxl读写操作的简洁性。通过一个删除最小值的案例,演示了Python处理Excel的实际应用。

工作中经常会遇到一些每天都要进行的重复操作,没一点技术含量,做起来却费时费力,还时不时出点小错。为应对这种情况,有些人会用VBA进行处理。但编辑了VBA功能的文件通用性不好,遇到领导、同事的excel未开启宏,就用不了。其实,用Python处理excel数据,比VBA更高效,而且还简单。我们来看看如何用Python处理excel数据:

一、Python处理Excel的方式

python对excel的操作是通过导入相应的功能库,然后利用库里的模块写代码实现的。与excel有关的库一般包括:xlrd、xlwt、xlutils、openpyxl、xlsxwriter,这五个库用法各异,综合来说,优先推荐opengyxl,不建议全部导入有备无患的想法。各库功能用法说明如下:

1、xlrd:读取excel文件的库

导入后,执行对excel文件打开、读取数据操作。比如:

import xlrd # 导入xlrd库
wb = xlrd.open_workbook(r"e:\test.xls")
sht = wb.sheets()[0]
aa = sht.name
bb = sht.cell_value(1, 1)
print(aa, bb)

代码解析:

1、导入xlrd库

2、打开e:\test.xls文件,wb代表该打开的工作薄

3、sht代表wb工作薄里第一个表单

4、aa代表sht表单的表单名

5、bb代表sht表单里第2行第2列单元格的值

6、在终端输出aa、bb,检验运行效果。

此时,若想修改bb单元格的值,是不可以的,因为导入的xlrd库只支持读取,不支持写入、修改。

2、xlwt:向excel表格写入数据的库

导入后,执行创建新表格,写入数据操作,比如:

import xlwt
wb = xlwt.Workbook()
sht = wb.add_sheet("表1")
sht.write(0, 0, '测试数据')
wb.save(r"e:\python\创建表.xls")

代码解析:

1、导入xlwt库

2、wb代表刚创建的工作薄

3、sht代表在wb工作薄中创建表单,表单名为“表1”

4、在sht表单中的a1单元格写入“测试数据”

5、保存工作薄路径及文件名为:“e:\python\创建表.xls”

3、xlutils:修改excel文件的库

导入后,执行打开既有excel表格数据的修改等操作,比如:

import xlrd
import xlutils as cp
wb = xlrd.open_workbook(r"e:\test.xls")
aa = cp.copy.copy(wb)
sht = aa.get_sheet(0)
sht.write(1, 1, "xxx")
aa.save(r"e:\test.xls")

代码解析:

1、2、导入xlrd库和xlutils库

3、打开"e:\test.xls"文件

4、aa代表复制刚才打开的文件

5、sht代表复制的文件第一个表单

6、向sht表单第2行第2列写入“XXX”

7、还是用原名保存文件,完成文件内容的修改。

以上三个库第一次使用时可能会提示报错:

在这里插入图片描述
这是因为系统里没有对应的xlrd库造成的,我们用pip方式先给系统里安装库:打开cmd命令,输入

pip install xlrd

在这里插入图片描述
回车,开始安装。稍等片刻,出现下面的界面即完成安装:

在这里插入图片描述
再回到vscode界面,提示已经没问题了。

在这里插入图片描述
同理,通过pip install xlwt,ipip install xlutils完成xlwt库和xlutils库的导入,就可以放心使用了。

以上库存在的不足:

1、三个库分别有各自的功能,一般需要同时使用才能满足实际使用,用起来比较麻烦。

2,xlwt库和xlutils库写入和修改操作,都只能保存为.xls格式,若保存为.xlsx格式,则打开文件时会提示格式错误。

3、写入操作后,未保存文件时读取不到刚写入的数据,读取的还是未写入之前的数据,只有保存后在读取才能得到正确结果。

4、openpyxl库

用opengyxl库操作excel,则能轻松解决上面三个库的不足,且代码更符合excel使用习惯。

import openpyxl
wb = openpyxl.load_workbook("e:\dest.xlsx")
sht = wb['sy']
print(sht['a2'].value)
sht['a2'].value = "新名字"
print(sht['a2'].value)
wb.save("e:\dest.xlsx")

代码解析:

1、导入openpyxl库

2、打开e:\test.xls文件,wb代表该打开的工作薄

3、sht代表wb工作薄里名字为sy的表单

4、读取输出sht表单a2单元格的内容

5、给sht表单a2单元格写入数据“新名字”

6、再次读取输出sht表单a2单元格的内容,会发现本次输出的就是刚才写入的"新名字"

7、保存文件,不更改文件名。

不足之处:不能操作.xls文件。

5、xlsxwriter库:可在excel文件里写入并设置图表的库,有图表要求的,后期专题学习。

6、com调用Excel的API库:通过COM调用,实现Python对excel操作的方法,写法与VBA非常相似,个人认为还不如python的openpyxl好用,且设置过程相对复杂,以后有机会再介绍。

理论结合实际,我们用一个真实案例来体验一下python处理excel数据的感觉:

文件“删除最小值.xlsx”中,(A:D)四列数据,希望删除每行的最小值,保留三个值,写入到后面(F:H)列中。

在这里插入图片描述
1、导入openpyxl库来处理:

 import openpyxl

2、打开文件,定义表单:

wb = openpyxl.load_workbook("e:\删除最小值.xlsx")
sht = wb['数据']

3、数据处理(请自动忽略粗糙的逻辑思路)

for i in range(2, 8):
 minnum = sht.cell(i,1).value
 if sht.cell(i, 2).value < minnum:
 minnum = sht.cell(i,2).value
 if sht.cell(i,3).value < minnum:
 minnum = sht.cell(i,3).value
 if sht.cell(i, 4).value < minnum:
 minnum = sht.cell(i, 4).value
 k = 0
 for j in range(1, 5):
 if sht.cell(i, j).value > minnum:
 k += 1
 sht.cell(i, k+5).value = sht.cell(i, j).value
 print(sht.cell(i, k+5).value, end=' ')
 print() 

4、保存文件:

wb.save("e:\python\删除最小值.xlsx")

运行后通过print代码在终端显示了结果:

在这里插入图片描述

打开表格,数据已经完成了填入:

在这里插入图片描述

总结:

总的来说,用openpyxl库让python处理excel还是比较容易的,符合python容易上手的特点,让大家把精力多放在问题解决思路上,而不是浪费在学习代码写法规则上。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


这份完整版的Python全套学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

<think>数据血缘(Data Lineage)是追踪数据从源头到最终使用过程中流动路径的技术,用于理解数据的来源、转换和依赖关系。建立数据血缘通常包含以下步骤: ### 1. **元数据采集** - **自动化采集**:通过工具扫描数据库、ETL脚本、BI报表等,提取表、字段、转换规则等信息。 - **手动补充**:对无法自动采集的部分(如业务规则)进行人工标注。 ### 2. **血缘关系建模** - **节点**:代表数据实体(如表、字段、报表)。 - **边**:代表数据流动方向(如从源表A到目标表B的ETL过程)。 - **工具示例**:使用图数据库(如Neo4j)存储血缘关系: ```cypher CREATE (source:Table {name:"订单表"})-[:转换 {rule:"清洗空值"}]->(target:Table {name:"分析表"}) ``` ### 3. **关键技术实现** - **SQL解析**:解析ETL脚本中的`SELECT/INSERT`语句,自动构建字段级血缘。 ```java // 使用Apache Calcite解析SQL获取血缘 SqlParser parser = SqlParser.create("INSERT INTO target SELECT a, b FROM source"); SqlNode node = parser.parseQuery(); LineageVisitor visitor = new LineageVisitor(); node.accept(visitor); // 输出:target(a,b) <- source(a,b) ``` - **日志分析**:捕获数据处理日志(如Spark任务日志)推断数据流向。 ### 4. **可视化与维护** - **可视化工具**:使用Grafana、Metabase等展示血缘图谱。 - **变更同步**:当数据结构或ETL流程变更时,触发血缘更新。 ### 实际案例 假设某电商公司需要追踪用户积分计算的血缘: 1. **源数据**:`订单表(order_db.orders)` → **ETL清洗** → `中间表(dw.user_points_temp)` → **聚合计算** → `目标表(report.user_points_summary)` 2. **血缘输出**: ``` 订单表.用户ID → user_points_temp.uid → user_points_summary.user_id 订单表.订单金额 → user_points_temp.amount → [公式:金额*0.1] → user_points_summary.points ``` §§相关问题§§ 1. SQL解析技术如何实现字段级数据血缘追踪? 2. 在实时数据流(如Kafka)中如何建立数据血缘? 3. 数据血缘如何辅助数据质量监控? 4. 开源工具有哪些支持自动血缘分析(例如Apache Atlas)? 5. 如何验证数据血缘图谱的准确性?</think>数据血缘(Data Lineage)是追踪数据从源头到最终使用全路径的技术,用于揭示数据的来源、转换过程、流动路径和依赖关系。建立数据血缘的核心方法如下: --- ### **数据血缘建立步骤** 1. **元数据采集** - **自动化扫描**:通过工具解析数据库日志、ETL脚本、BI报表等,自动提取表/字段级血缘 *工具示例*:Apache Atlas、Alation、OpenLineage - **手动标注**:对无法自动捕获的转换逻辑(如Excel手工处理)添加注释标签 ```python # 手动标注示例(伪代码) add_lineage( source="sales_raw.csv", target="revenue_report.xlsx", process="手工汇总:删除测试数据,计算季度总和" ) ``` 2. **血缘关系建模** - **节点**:数据实体(表、字段、文件、报表) - **边**:数据流动方向(包含转换规则) - **存储结构**:推荐图数据库(Neo4j)存储关系 ```cypher // Neo4j血缘关系示例 (source:Table {name:"orders"})-[:TRANSFORM {rule:"filter status='completed'"}]->(target:Table {name:"valid_orders"}) ``` 3. **关键技术实现** - **SQL解析**:通过语法分析器(如ANTLR)解析ETL脚本中的`SELECT/INSERT`语句 ```java // 使用Apache Calcite解析SQL血缘 SqlParser parser = SqlParser.create("INSERT INTO dw_sales SELECT * FROM raw_orders"); SqlNode node = parser.parseQuery(); // 输出血缘:dw_sales <- raw_orders ``` - **日志追踪**:在数据处理流程(如Spark/Flink任务)中植入跟踪日志 - **API集成**:对接调度系统(Airflow)获取任务依赖关系 4. **可视化与应用** - **血缘图谱**:使用D3.js/Echarts生成交互式血缘图 ![数据血缘可视化示例](https://example.com/lineage-graph.png) - **应用场景**: - 影响分析:修改源表时快速定位受影响报表 - 故障排查:数据异常时追溯问题环节 - 合规审计:满足GDPR等数据溯源要求 --- ### **最佳实践** - **分级实施**:先建立关键业务表血缘,再扩展至字段级 - **变更同步**:将血缘维护纳入CI/CD流程,随代码更新自动刷新 - **血缘质量监控**:定期检查断链节点(如未关联的中间表)
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值