当前位置: 首页 > 科技观察

太强大了!Python开发桌面小工具,让代码为我们做重复性的工作!

时间:2023-03-14 00:23:41 科技观察

决定写这篇文章是因为有朋友问“如何用Python根据数据源自动生成数据透视表”。这道题背后有一个很好的解决办法,让代码为我们做重复的工作,从而减少工作量,减少错误。Python开发的小工具,其实就是把Python程序打包成一个exe,分享后就可以使用了。即使电脑没有Python环境,也可以使用。使用代码提高工作效率,尽量减少加班。内容大纲明确需求:自动生成数据透视表【这部分可以由你重复工作代替】安装三方依赖库:tkinter和pyinstaller代码实现:包括Python生成数据透视表和桌面GUI联动设计打包Python程序两部分生成exe即可执行文件解决exe文件可能过大的问题:安装虚拟环境需要后台在工作中进行重复操作,使用供应商名称、月份、入库三个字段总计生成所需的数据透视表格式。安装三方依赖库创建桌面窗口。这里我们使用tkinter,它是Python自带的一个GUI库。安装后即可使用。pipinstalltkinter使用pyinsatller将程序打包成exe。好处是不需要把代码部署到服务器上,直接把打包好的exe发给对方,就可以直接使用了。对这种小巧轻便的功能非常友好。pipinstallpyinstaller代码实现Excel文件生成数据透视表和过滤数据,文件名:excel_to_pivot.pyimportpandasaspdimportnumpyasnpclassExcelToPivot(object):def__init__(self,filename,file_path):self.file_name=filenameself.file_path=file_path"""Excel的自动数据透视表函数返回数据透视结果"""defexcel_Pivot(self):print(self.file_path)data=pd.read_excel(self.file_path)data_pivot_table=pd.pivot_table(data,index=['Suppliername','month'],values=["receivedamount"],aggfunc=np.sum)returndata_pivot_table"""按条件筛选并保存"""defselect_data(self,name,month):data_pivot_table=self.excel_Pivot()data_new=data_pivot_table.query('供应商名称==["{}"]&month=={}'.format(name,month))data_new.to_excel('{}.xlsx'.format(str(self.file_name).split('.')[0]))return'筛选完成!'if__name__=='__main__':filename=input("请输入文件名:")path='C:/Users/cherich/Desktop/'+filenamepros=ExcelToPivot(filename,path)print(pross.select_data("C",4))设计桌面窗口函数,文件名:opration.pyfromtkinterimportTk,Entry,Button,mainloopimporttkinter.filedialogimportexcel_to_pivotfromtkinterimportmessageboxfromtkinterimportttkdefUpload():全局文件名,data_pivot_tabletry:filename=tkinter.filedialog.askopenfilename(title='SelectFile')pross=excel_to_pivot.ExcelToPivot(str(filename).split('/')[-1],filename)data_pivot_table=pross.excel_Pivot()messagebox.showinfo('Info','Conversionsucceeded!')除了异常为e:print(e)messagebox.showinfo('Info','Conversionfailed!')defselect(name,month):try:print('供应商名称==["{}"]&month=={}'.format(name,month))data_new=data_pivot_table.query('供应商名称==["{}"]&month=={}'.format(name,month))data_new.to_excel('{}.xlsx'.format(str(filename).split('.')[0]))messagebox.showinfo('Info','筛选完成,生成文件!')root.destroy()exceptException作为e:print(e)messagebox.showinfo('Info','Filterfailed!')root=Tk()root.config(background="#6fb765")root.title('Autopivottablewidget')root.geometry('500x250')e1=Entry(root,width=30)e1.grid(row=2,column=0)btn1=Button(root,text='Uploadfile',command=Upload).grid(row=2,column=10,pady=5)box1=ttk.Combobox(root)#使用grid()控制控件box1.grid(row=5,sticky="NW")#设置drop-downmenuThevalueofbox1['value']=('A','B','C','D','supplier')#通过current()box1设置下拉菜单选项的默认值.current(4)box2=ttk.Combobox(root)box2.grid(row=5,column=1,sticky="NW")box2['value']=(1,2,3,4,5,6,7,8,9,10,11,12,'month')box2.current(12)#写一个回调函数,绑定执行事件deffunc(event):globalb1,b2b1=box1.get()b2=box2.get()#绑定下拉菜单事件box1.bind("<>",func)box2.bind("<>",func)btn2=Button(root,text='过滤数据',命令d=lambda:select(b1,b2)).grid(row=30,column=10,pady=5)mainloop()如果运行结果如上,说明代码没有问题,你可以进行下一步将Python程序打包生成exe,打开DOS窗口切换到两个py文件所在目录,注意路径不要有中文。pyinsatller-F-wopration.pypyinstaller命令常用可选参数:-i为应用程序添加一个图标-F指定打包后只生成一个exe格式文件-D–onedir创建一个包含exe文件的目录,但将依赖很多文件(默认选项)-c–console,–nowindowed使用控制台,无界面(默认)-w–windowed,–noconsole使用窗口,无控制台-p在当前目录下添加搜索路径,会生成两个文件夹:构建和分发。dist里面都有可执行的exe文件,把快捷方式发到桌面,点击opration.exe运行,可以把它的快捷方式发到桌面,双击。解决exe文件可能过大的问题。有小伙伴刚安装好Python环境不久,可能不存在文件过大的问题。比如我的电脑安装了很多Python依赖包和anaconda,打包后的文件居然有660M,打包时间很长,执行的时候还是卡住了。后来整改后缩小到31M,打包速度很快,秒级执行。解决方法是在Windows系统下安装Python虚拟环境,前提是电脑上已经安装了Python,才能进行下面的操作。找到Python所在的路径。如果忘记了,可以在电脑左下角搜索【编辑系统环境变量】-【用户变量】-【PATH】找到配置虚拟环境。虚拟环境可以理解为Python解释器的一个副本。在此环境中,您可以安装私有包,而不会影响系统上安装的全局Python解释器。虚拟环境对于避免系统的Python解释器中的包混乱和版本冲突非常有用。重要的是不同的虚拟环境可以构建不同的Python版本,创建时选择。我们这里需要一个比较“干净”的Python环境,不需要安装太多的依赖包,也避免了exe包文件体积过大,所以使用了虚拟环境。安装虚拟环境依赖包pipinstallvirtualenvpipinstallvirtualenvwrapper-win创建虚拟环境命令mkvirtualenv-p="C:\Users\cherich\AppData\Local\Programs\Python\Python38\python.exe"py38进入虚拟环境,你可以看到只有几个默认的Python库。这时可以测试一下代码,看看是否缺少相关的依赖。例如,我缺少Pandas和openpyxl。你可以根据pipinstall的包名依次安装。非常重要:必须在更新文件之前重新安装pyinstaller。缩小。以上操作完成后,打包就可以了,最后退出虚拟环境。退出虚拟环境deactivate后,整个自动化思路的实现就完成了。您可以将整个过程应用到您现有的重复性工作中。过程中有两点需要注意,如下:尽量不要使用中文路径,不然会报一些莫名其妙的错误。导入包是为了尽量避免使用import*导入不需要的包,节省打包和执行时间。让代码自动运行,节省时间,摸鱼,玩小游戏,是不是很好~