作者 | 周萝卜

来源丨萝卜大杂烩

今天我们继续分享真实的自动化办公案例,希望各位 Python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 Python,使得工作事半功倍!

需求

由于工作当中经常需要对比前后两个 Excel 文件,文件内容比较多,人工肉眼对比太费劲,还容易出错,搞个 Python 小工具,会不会事半功倍

运行脚本,可以把前后两个 Excel 文件当中不同的内容数据展现出来,不同 sheet 页签表示不同的数据处理结果

需求解析

不需要解析,直接干

代码实现

我们先导入两份测试数据,进行 old 和 new 的处理,注意数据中 account number 是唯一索引

old = pd.read_excel('sample-address-1.xlsx', 'Sheet1', na_values=['NA'])
new = pd.read_excel('sample-address-2.xlsx', 'Sheet1', na_values=['NA'])
old['version'] = "old"
new['version'] = "new"

对于我们这个小工具,主要考虑三种变化类型

  • 哪些是新增的 account

  • 哪些是被删除的 account

  • 哪些是被修改的 account

对于新增和删除的 account,我们可以直接用两份数据相减即可

old_accts_all = set(old['account number'])
new_accts_all = set(new['account number'])dropped_accts = old_accts_all - new_accts_all
added_accts = new_accts_all - old_accts_all

接下来我们再将所有的数据拼接到一起,并使用 drop_duplicates 来保留被修改的数据

all_data = pd.concat([old,new],ignore_index=True)
changes = all_data.drop_duplicates(subset=["account number","name", "street","city","state","postal code"], keep='last')

接下来,我们需要找出哪些 account 有重复的条目,重复的 account 表明更改了我们需要标记的字段中的值。我们可以使用重复函数来获取所有这些 account 的列表,并仅过滤掉那些重复的 account

dupe_accts = changes[changes['account number'].duplicated() == True]['account number'].tolist()
dupes = changes[changes["account number"].isin(dupe_accts)]dupe_accts = changes[changes['account number'].duplicated() == True]['account number'].tolist()dupes = changes[changes["account number"].isin(dupe_accts)]

现在我们将旧数据和新数据进行拆分,删除不必要的版本列并将 account 设置为索引

change_new = dupes[(dupes["version"] == "new")]
change_old = dupes[(dupes["version"] == "old")]
change_new = change_new.drop(['version'], axis=1)
change_old = change_old.drop(['version'], axis=1)
change_new.set_index('account number', inplace=True)
change_old.set_index('account number', inplace=True)
df_all_changes = pd.concat([change_old, change_new],axis='columns',keys=['old', 'new'],join='outer')
df_all_changes

接下来我们定义一个函数来展示从一列到另一列的变化

def report_diff(x):return x[0] if x[0] == x[1] else '{} ---> {}'.format(*x)def report_diff(x):    return x[0] if x[0] == x[1] else '{} ---> {}'.format(*x)

现在使用 swaplevel 函数来获取彼此相邻的旧列和新列

最后我们使用 groupby 然后应用我们自定义 report_diff 函数将两个相应的列相互比较

df_changed = df_all_changes.groupby(level=0, axis=1).apply(lambda frame: frame.apply(report_diff, axis=1))
df_changed = df_changed.reset_index()df_changed = df_all_changes.groupby(level=0, axis=1).apply(lambda frame: frame.apply(report_diff, axis=1))df_changed = df_changed.reset_index()

接下来我们需要找出被删除和新增的数据

df_removed = changes[changes["account number"].isin(dropped_accts)]
df_added = changes[changes["account number"].isin(added_accts)]df_removed = changes[changes["account number"].isin(dropped_accts)]df_added = changes[changes["account number"].isin(added_accts)]

我们可以使用单独的选项卡将所有内容输出到 Excel 文件,对应于更改、添加和删除

output_columns = ["account number", "name", "street", "city", "state", "postal code"]
writer = pd.ExcelWriter("my-diff.xlsx")
df_changed.to_excel(writer,"changed", index=False, columns=output_columns)
df_removed.to_excel(writer,"removed",index=False, columns=output_columns)
df_added.to_excel(writer,"added",index=False, columns=output_columns)
writer.save()

最后,我们就得到了最开始的效果图片展示的一个新的 Excel 文件

当然上面的代码对于毫无编程的人来说还是有一点点复杂,我们还是做成 GUI 小程序吧,这次我们使用 Tkinter 来编写 GUI 程序

我们首先导入 Tkinter 库并进行初始化

import tkinter
from tkinter import *
from tkinter import Label, Button, Entry, messagebox
from tkinter import filedialog
from deal import deal_excelwindow = tkinter.Tk()
path_file1 = StringVar()
path_file2 = StringVar()
path_path = StringVar()
window.geometry('380x150')

这里我们定义了三个 String 类型的变量,用来保存文件地址和文件夹路径

然后我们进行简单的页面排版,只需要用到 Label,Entry 和 Button 就够了

label1 = Label(window, text="文件1:").grid(column=0, row=0)
txt1 = Entry(window, width="30", textvariable=path_file1).grid(column=1, row=0)
button1 = Button(window, text="文件选择1", command=selectFile1).grid(column=2, row=0)label2 = Label(window, text="文件2:").grid(column=0, row=1)
txt2 = Entry(window, width="30", textvariable=path_file2).grid(column=1, row=1)
button2 = Button(window, text="文件选择2", command=selectFile2).grid(row=1, column=2)label3 = Label(window, text="新文件路径:").grid(column=0, row=2)
txt3 = Entry(window, width="30", textvariable=path_path)
txt3.grid(column=1, row=2)
button3 = Button(window, text="新文件路径", command=selectPath).grid(row=2, column=2)button4 = Button(window, text="开始处理", command=save_path).grid(row=3, column=1)

用于获取文件和文件夹的函数

def selectFile1():path_ = filedialog.askopenfilename()path_file1.set(path_)

用于保存新生成文件和提示消息的函数

def save_path():path = txt3.get()deal_excel(path)res = "对比处理完成!"messagebox.showinfo('萝卜大杂烩', res)

这样,一个简单的 Excel 对比工具就完成啦

好了,这样我们就完成了一个简易的 GUI 拆分 PDF 文件的工具喽~

技术

用Python写了个使命召唤外挂

资讯

俄罗斯 Android 系统受限

技术

面向小白超全Python可视化教程

技术

一行Python代码能干嘛?来看!

分享

点收藏

点点赞

点在看

Python 自动化办公之 Excel 对比工具相关推荐

  1. Python自动化办公之Excel对比工具

    今天我们继续分享真实的自动化办公案例,希望各位 Python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 Python,使得工作事半功倍! 需求 由于工作当中经常需要对比前后两个 Exc ...

  2. python自动化办公:excel篇,从此做表不加班。

    表格讲解 表格格式 表格分为:工作簿,工作表,单元格 如图:整个文件就是一个工作簿,下面的 zhengjiang_power 和sheet1为工作表. xlrd +xlwt读写表格 因为电脑右键新建的 ...

  3. Python 自动化办公之 Excel 拆分并自动发邮件

    作者 | 周萝卜 来源 | 萝卜大杂烩 今天我们来分享一个真实的自动化办公案例,希望各位 Python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 Python,使得工作事半功倍! 需求 ...

  4. Python自动化办公之PDF拆分工具

    今天我们继续分享真实的自动化办公案例,希望各位 Python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 Python,使得工作事半功倍! 需求 需要从 PDF 中取出几页并将其保存为新 ...

  5. Python自动化办公-让 Excel 飞起来

    Python 操作 Excel 可能是自动化办公最火热的需求了,看一看公众号文章底部的视频广告就知道了,里面尽是一些 5 分钟搞定 excel,将数据生成漂亮的图表. 5 分钟虽然有些夸张,但是快速操 ...

  6. Python自动化办公之Excel拆分并自动发邮件

    今天我们来分享一个真实的自动化办公案例,希望各位 Python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 Python,使得工作事半功倍! 需求 需要向大约 500 名用户发送带有 E ...

  7. python与word交互_[Python] 自动化办公 邮件/Excel/Word交互快速生成介绍信

    转载请注明:陈熹 chenx6542@foxmail.com (简书号:半为花间酒) 若公众号内转载请联系公众号:早起Python 这篇文章能学到的主要内容: imbox 读取邮件解析附件 openp ...

  8. Python自动化办公:读取Excel数据并批量生成合同,高效办公,快速回家

    前言 在我们的工作中,面临着大量的重复性工作,通过人工方式处理往往耗时耗力易出错.而Python在自动化办公方面具有极大的优 势,可以解决我们工作中遇到的很多重复性问题,分分钟搞定办公需求.快速下班回 ...

  9. Python 自动化办公:Excel 自动绘制图表

    今天的主题是 Excel,相信大家都比较熟悉吧.而且我相信,大家在日常使用 Excel 的时候,肯定会遇到很多重复繁琐的工作,因为我也同样遇到过.这个时候我通常都会思考下,有没有办法让繁琐的事情变得简 ...

最新文章

  1. 2022-2028年中国工业4.0深度调研及投资前景预测报告(全卷)
  2. Redis 之布隆过滤器与布谷鸟过滤器
  3. 外媒列10大理由建议消费者不购买iPad
  4. arcgis开发常用源码
  5. java内部类的定义原则
  6. linux内核创建ubi,UBI文件系统制作和挂载
  7. 扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
  8. rake -T 列出所有RAKE 命令.
  9. 行内框可以修改的尺寸
  10. 01-spring配置详解
  11. web----tcp三次握手
  12. gsoap插件之wsdd主动广播发送hello、bye
  13. dgl._ffi.base.DGLError: Cannot assign node feature “n_feat“ on device cuda:0 to a graph on device
  14. 做了n年程序猿,才知道电脑是这样工作的
  15. 【漏洞复现】局域网 ARP 中间人攻击 获取他人账号密码
  16. 迅雷上传速度怎么限制的方法
  17. 基于ISO27001的数据中心信息安全管理体系
  18. 【SpringBoot】实现短信验证码登录(榛子云的SDK)
  19. 非激活窗口(Inactive Window)
  20. 前程无忧推进私有化:CEO甄荣辉持股19%,多次陷入信息泄露风波

热门文章

  1. 计算机组原理ppt,计算机组原理第三章.ppt
  2. 系列四、SpringMVC响应数据和结果视图
  3. java中的类修饰符、成员变量修饰符、方法修饰符。
  4. YYHS-魏传之长坂逆袭(梦回三国系列T1)
  5. 3.Java集合-HashSet实现原理及源码分析
  6. 开源交换需新框架 技术团队也待整合
  7. 2017浅谈面试(一)
  8. 通过响应式web设计,使本站支持手机浏览
  9. ubuntu12.04 alternate win7 双系统安装
  10. tomcat高并发的配置