明天咱们持续分享实在的自动化办公案例,心愿各位 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_alladded_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 tkinterfrom tkinter import *from tkinter import Label, Button, Entry, messageboxfrom tkinter import filedialogfrom 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 比照 Excel 文件的工具喽

喜爱就在看、点赞,转发,三连反对一下噻!

本文由mdnice多平台公布