对比excel和python数据分析工具区别,python excel数据对比
最近有朋友说需要一个工具来比较两张excel表的差异,直接标注有差异的行。
代码非常简单。为了方便端庄舞的使用,我把它打包成一个exe文件,点击执行输出结果。
1.先说怎么用,后面是代码链接:https://pan.baidu.com/s/1oNEeIDOnw1Grw2MOdJrwUQ.
提货代码:w29l
先去网盘链接下载文件:
如果不需要源码,直接下载xlsx_compare.rar即可。
解压后打开:
这两个xlsx文件是我用来测试的文件。可以直接用自己的替换。必须有两个文件。不要放其他文件。
重要提示:你的两个excel文件必须是xlsx格式文件,比较内容要放在Sheet1中。
点击exe文件,结果如下:
会输出三个文件,第一个error_info.txt,也就是执行过程中出错的信息会被写入这个文件,如果运行正常,会被写成如下。
如果出现异常,比如你忘了放入两个比较文件,error_info.txt就是这样。
new末尾的另外两个文件是比较的结果。打开看看吧。
因为D列的数据太长,拆开就能看到内容。
如果发现比较不一致,将在最后一列中标记为比较结果。
像这样,意味着两个文件的第5、6、7行不一致。第八行被标记是因为test1.xlsx没有第八行中的数据,但是test2.xlsx有。
这样我们就可以通过excel的filter进行筛选,就可以得到两个文件不一致的所有行。
2、代码#!/usr/从容的舞蹈/env python #-*-编码:utf-8-*-#日期:2021/4/17 #文件名:xlsx _ compare #作者:kpli import pandas as PD import osdef my _ log(info):try:with open( error _ info。txt , w )作为f:f . write(info)f . close()异常作为e:print(写入错误日志时发生以下错误:\ n % s % e def get _ file():try:#获取当前文件夹下的2个文件dir _ path=OS。getcwd()files=OS。list dir(dir _ path)ret=[]for I in files:if I .以( .xlsx’)而不是I .以( _ new)结尾。xlsx ):ret。如果I .以()结尾,则追加I .xlsx’),而不是i: info=中的i.endswith(_new.xlsx )和 ~$ 请关闭文件%s%i我的日志(信息)如果len(ret)==0: info=则返回没有人找不到待检测文件,请将2个文件格式文件放入此文件夹my _ log(info)返回None # print(ret)ret[0 ], ret[1]异常为e:my _ log(str(e))def main(file 1,file2): try: # 1、获取原文件路径和名称,先准备即将生成的新文件名和文件路径fname1,ext=OS。路径。拆分分机(操作系统。路径。base name(file 1))new _ file 1=file 1。替换(fname 1,fname1 _new) fname2,ext=OS。路径。拆分分机(操作系统。路径。base name(file 2))new _ file 2=file 2。替换(fname 2,fname2 _new) # 2,读取文件df1=PD。read _ excel(文件1)df2=PD。read _ excel(file 2)length=len(df1)if len(df1)=len(df2)else len(df2)#两个数据块行数不一致,补成一致的如果len(df1) - len(df2) 0: #获取DF1的列名d={} for i in df2,columns:d[I]=[ for x in range(len(df1)-len(df2))]concat _ df=PD .DataFrame(d) df2=pd.concat([df2,concat _ df])if len(df2)-len(df1)0:d={ } for I in df1。columns:d[I]=[ for x in range(len(df2)-len(df1))]concat _ df=PD .DataFrame(d) df1=pd.concat([df1,concat _ df])dis _ index=[]for I in range(len(df1)):ret=df1。iloc[I,==df2.iloc[i,]if ret中的False。to list():dis _ index。append(I)dis _ list=[ for I in range(length)]for I in dis _ index:dis _ list[I]=不一致df1[比较结果]=dis_list df2[比较结果]=dis _ list df1。to _ excel(新文件1,索引=假)df2。to _ excel(new _ file 2,index=False) my_log(校验成功,本次对比文件为:%s%s和%s%s%(fname1,ext,fname2,ext)) print(校验完成,请查看新文件)除了e:打印(出现未知错误,请查看错误信息。txt )my _ log(str(e))if _ _ name _ _= _ _ main _ _ :if not get _ file():print(读取文件时发生错误,请查看error_info.txt) else: file1,file2=get_file() main(file1,file2)总共有3个函数:
1、我的日志函数用来写入日志。
2、获取文件函数用来获取当前路径下所有后缀名为。文件格式的文件,会排除掉_new.xlsx文件,并且如果当前文件夹下有打开的超过文件,会自动结束运行,提示关闭当前文件夹下已被打开的超过文件。
3、主要函数用来处理比对,并输出结果:
这里主要使用熊猫读取数据并逐行对比,如果不一致,会记录下差异的位置,当检查完所有行后,给数据块加上一列比较结果,把差异的行做一个标记,最后写入生成2个新文件。
依赖包都在requirements.txt里:
熊猫
openpyxl 3.0.7
xlrd 1.2.0
可以直接点安装-r要求。txt,直接下载安装依赖包。
逻辑很简单,但是还没有完全测试过。在一些特殊情况下可能会有其他错误。如果是这样的话,给我留言解释是什么原因导致了错误,有时间的话再改进。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。