首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

掌握Python技巧:如何比较两个Excel表格并发现隐藏的差异

大家在工作中会经常遇到需要对比两个不同表格之间的异同,当比较两个Excel表格时,需要处理大量的数据和复杂的信息。这个过程可能会变得繁琐且耗时。但是,幸运的是,我们可以利用Python编程语言来轻松地完成这项任务。

无论您是数据分析师、软件开发人员还是对Excel数据感兴趣的普通用户,本文都将为您提供有价值的技巧和洞见。无论您是要检查数据集的一致性、寻找变更的地方,还是想比较不同版本之间的差异,本文都会为您提供实用的解决方案和示例代码。

我们希望这篇文章能够帮助您更好地理解如何使用Python来比较Excel表格,并为您在日常工作中提供便利。让我们开始探索这个令人兴奋的领域吧!

本文将介绍如何使用Python对比两个Excel表格。我们将探索两种常用的方法,一种是基于Pandas库,另一种是基于Openpyxl库。这两种方法都非常强大且灵活,可以根据您的需求进行定制。

Pandas库的优缺点:

优点:强大的数据处理能力:Pandas提供了丰富的数据处理和操作功能,可以轻松处理大规模的Excel文件,包括数据清洗、变换、切片等。

缺点:内存占用较大:处理大型Excel文件时,Pandas可能会占用较多的内存,特别是涉及大规模数据操作时。

Openpyxl库的优缺点

优点:与Excel文件的直接交互:Openpyxl允许直接读取和写入Excel文件,提供了对Excel文件更细粒度的控制,可以对具体的单元格进行操作。

缺点:不适合大规模数据处理:Openpyxl相对而言不如Pandas在大规模数据处理方面高效,特别是对于数据清洗、分析和计算等复杂操作,可能需要额外的编码和处理。

一、环境准备:

Python 版本:Python 3.10.2

pandas库: 2.1.0

Openpyxl库版本: 3.0.10

python去官方网站下载即可:https://www.python.org/downloads/release/python-3102/

安装模块

pip install pandas ?pip install openpyxlpip install xlsxwriter

二、代码实现

经过上面简单的环境准备后开始后面的代码实现

操作过程分为以下几个部分:

打开表格。

遍历第一个表格,将需要核对的单元格内容去第二个表格中进行对比。

可以加一个备注行,将数据不一致的根据条件判断去写备注。

将新生成的数据保存到新的sheet中。

(文章会根据个人思路把各部分展示出来,最后将全部代码写到文章尾部)

首先需要做的是如何打开表格:

pandas 打开表格和保存方法如下:

import pandas as pdno_port = pd.read_excel('表格名称.xlsx',sheet_name='Sheet1') #打开表格#使用pandas打开表格会生成一个dataframe类型的数据,可以通过get列名的方式打开对应的列print(no_port) ?#可查看打开的表格,并指定sheet名为Sheet1的整体数据print(no_port.get('标题名')) #可查看指定列的所有数据no_port.to_excel('表格名称.xlsx',index=False) # ?可将dataframe类型的数据直接加to_excel进行保存

大家知道excel表格是有很多个sheet名组成,可以根据自己需求,创建多个sheet进行保存

表格演示

dataframe类型数据展示

获取指定列的展示

openpyxl打开表格和关闭表格如下:

from openpyxl import load_workbookwb = load_workbook(r'表格名字xlsx') #打开表格,打开表格不需要指定sheet,print(self.pd_wb.sheetnames)#查看全部sheet名字wb.save(filename)#保存数据

openpyxl在读取表格的时候会将全部sheet的数据都读入内存,

但pandas模块只能将单个sheet的数据读入内存 openpyxl 可以通过wb['sheet名']的方式对单个sheet内的数据进行处理。现在假定所有数据都保存在一个excel中,所以选择openpyxl模块进行打开

由于pandas 对数据处理更灵活,所以可以写一个方法将所有openpyxl 生成的数据转化为pandas模块处理dataframe类型数据,代码如下:

数据转化

def transform_type(workbook): ? ? ? ?''' ? ? ? ? 将openpyxl 生成的Worksheet类型改成dataFrame类型, ? ? ? ?:return DataFrame: ? ? ? ?''' ? ? ? ?data = workbook.values ? ? ? ?df_data = pd.DataFrame(data) ? ? ? ?df_data.columns = df_data.iloc[0]#在转化过程中会记录表格原始的标题,将表格第一行设为标题 ? ? ? ?df_data = df_data[1:] ?#实际数据则从第二行开始,因为第一行是标题 ? ? ? ?return ?df_data#使用:wb = load_workbook(r'表格名字xlsx') #打开表格,打开表格不需要指定sheet,workbook = wb['sheet1']dataframe =transform_type(workbook)这样就将数据改成dataframe类型了

ok,通过上面可以将openpyxl 生成的数据的每个需要的sheet都转化为pandas可以处理的dataframe数据,下面需要写一个可以进行搜索的方法。就是搜索某条数据在表格中的位置

(行数,列名)

单元格数据搜索

def serch_ser(df_data,find_key): ? ?''' ? ?根据条件find_key查找对应的表格中的数据 ? ?:param: DataFrame,find_key(条件): ? ?:return:返回查询数据所在行 ? ?''' ? ?filtered_df = df_data.apply(lambda x: x.astype(str).str.contains(find_key, case=False)) ? ?indexes= filtered_df.stack().idxmax() # 默认只有一行符合要求 ? ?#filtered_df = df_data.apply(lambda x: x.astype(str).str.contains(find_key, case=False)) ? ?#indexes = filtered_df.index[filtered_df.any(axis=1)] ? ?return indexes#使用workbook1= wb['sheet1']workbook2= wb['sheet2']dataframe1 =transform_type(workbook1)dataframe2 =transform_type(workbook2)for line in dataframe1.values: ? ?#比方说用第一个表格中的line[0]去第二个表中去搜索, ? ?cell = serch_ser(dataframe2,line[0]) # cell是第二个表搜索到的数据的行号 ? ?#可以根据行号得到第二个表中同行的其他数据,并和第一个表格中的数据进行对比 ? ?#比如说第一个表格dataframe1的每行第二列line[1] 和第二个表格的'自定义列表'是相同的 ? ?if len(cell):#可以做个判断,或许在第二个表中没有找到对应数据 ? ? ? ?flog = dataframe.get('自定义列表')[cell] ? ? ? ?if line[1] != flog: ? ? ? ? ? ?print('数据不一致') ? ?else: ? ? ? ?print('第二个表中没有%s数据'%line[0])

加备注行和保存:

dataframe['备注'] = ''*len(dataframe) # 目前只是加了一个空列dataframe.at[行号, "备注"] = '一些信息' #可根据行号和列名,将备注信息写入# ?指定保存到哪个表格的哪个sheet中,并且不要每行前的序号。dataframe.to_excel('表格名.xlsx',sheet_name='sheet_name',index=False)

总结:通过上面的几个过程,基本上一个处理不同表格数据的代码就完成了,下面是总体代码,目的是对比两个表格中不同表中服务的端口是否一样,不一样的标出来

# --------encoding:utf-8 -------------import pandas as pdfrom openpyxl import load_workbookclass check_port: ? ?def __init__(self): ? ? ? ?self.pd_wb = load_workbook(r'output1.xlsx') ? ? ? ?self.pd_wb_data1 = self.pd_wb['Sheet1'] ? ? ? ?self.pd_wb_data2 = self.pd_wb['Sheet2'] ? ?def transform_type(self,workbook): ? ? ? ?''' ? ? ? ? 将openpyxl 生成的Worksheet类型改成dataFrame类型, ? ? ? ?:return DataFrame: ? ? ? ?''' ? ? ? ?data = workbook.values ? ? ? ?df_data = pd.DataFrame(data) ? ? ? ?df_data.columns = df_data.iloc[0] ? ? ? ?df_data = df_data[1:] ? ? ? ?return ?df_data ? ?def serch_ser(self,df_data,find_key): ? ? ? ?''' ? ? ? ?根据条件find_key查找对应的表格中的数据 ? ? ? ?:param DataFrame,find_key(条件): ? ? ? ?:return:返回指定列col_name在查找项同行数据 ? ? ? ?''' ? ? ? ?filtered_df = df_data.apply(lambda x: x.astype(str).str.contains(find_key, case=False)) ? ? ? ?indexes ?= filtered_df.stack().idxmax() ? ? ? ?#filtered_df = df_data.apply(lambda x: x.astype(str).str.contains(find_key, case=False)) ? ? ? ?#indexes = filtered_df.index[filtered_df.any(axis=1)] ? ? ? ?if len(indexes) >1: ? ? ? ? ? ?return indexes[0] ? ? ? ?return None ? ?def compare_dataframe(self): ? ? ? ?dataframe1 = self.transform_type(self.pd_wb_data1) ? ? ? ?dataframe2 = self.transform_type(self.pd_wb_data2) ? ? ? ?dataframe3 = dataframe1.copy() #复制一份出来,最终保存数据用 ? ? ? ?dataframe3['备注'] = ''*len(dataframe3) ? ? ? ?for line in dataframe1.values: ? ? ? ? ? ?notes = '' #备注信息 ? ? ? ? ? ?cell = self.serch_ser(dataframe2,line[1]) ? ? ? ? ? ?if cell: ? ? ? ? ? ? ? ?new_data = dataframe2.get('端口号')[cell] ? ? ? ? ? ? ? ?if line[2] != new_data: ? ? ? ? ? ? ? ? ? ?notes += ' 端口不一致' ? ? ? ? ? ?else: ? ? ? ? ? ? ? ?notes += '信息不存在' ? ? ? ?code = self.serch_ser(dataframe3, line[1]) ? ? ? ?dataframe3.at[code, "备注"] = notes ? ? ? ?dataframe3.to_excel('output3.xlsx',sheet_name='Sheet1',index=False)custom = check_port()custom.compare_dataframe()

在我们的测试过程中,我们比较了两个表格,发现几乎不存在语法错误或其他问题。我们还发现,代码执行速度很快,这意味着我们可以更快地完成数据比较任务,并有更多时间进行分析和解释。

通过这种方法,我们可以轻松应对大型数据集,完成快速、准确的数据比较工作。这种方法可应用于各种不同的业务场景和数据类型,包括金融、医疗和工业等领域。

作为 Python 数据科学应用的一个例子,我们希望这篇文章能够激发更多读者去尝试新的数据比较方法,使用 Python 写出更出色的代码。

如果你对这种数据比较工具感兴趣,我们建议你继续深入研究 Python 的 Pandas、NumPy 和 OpenPyXL 库,并尝试在自己的工作中应用这些工具。我们相信,随着数据时代的发展,Python 的强大数据科学功能将变得越来越重要。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OV9Tv4fNdJ185JiQ7gvbrNSA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券