太強(qiáng)了!Python 開發(fā)桌面小工具,讓代碼替我們干重復(fù)的工作!
決定寫這篇文章的初衷是來源于一位小伙伴的問題,關(guān)于"如何根據(jù)數(shù)據(jù)源用 Python 自動(dòng)生成透視表",這個(gè)問題背后有個(gè)非常好的解決思路,讓代碼替我們做重復(fù)的工作,從而減輕工作量,減少出錯(cuò)。
Python 開發(fā)的小工具實(shí)際上是將 Python 程序打包成 exe,分享即可用,即便電腦沒有安裝 Python 環(huán)境,也可以使用,用代碼提高工作效率,盡量少加班。
內(nèi)容大綱
- 明確需求:自動(dòng)生成透視表【這部分可以換成你的重復(fù)性工作】
- 安裝三方依賴庫:tkinter 和 pyinstaller
- 代碼實(shí)現(xiàn):包括兩部分 Python 生成透視表和桌面 GUI 聯(lián)動(dòng)設(shè)計(jì)
- 打包 Python 程序 生成 exe 可執(zhí)行文件
- 解決 exe 文件可能過大問題:安裝虛擬環(huán)境
需求背景
將工作中重復(fù)性的操作,利用供應(yīng)商名稱,月份,入庫金額三個(gè)字段來生成想要的透視表格式。
安裝三方依賴庫
創(chuàng)建桌面窗口,這里使用 tkinter,它是 Python 自帶的 GUI 庫,安裝后即可使用。
pip install tkinter
使用 pyinsatller 將程序打包成 exe,好處是不需要將代碼部署到服務(wù)器,直接將打包好的 exe 發(fā)給對方,就能直接使用,對于這種小而輕的功能非常友好。
pip install pyinstaller
代碼實(shí)現(xiàn)
Excel 文件生成透視表和篩選數(shù)據(jù),文件名:excel_to_pivot.py
import pandas as pd
import numpy as np
class ExcelToPivot(object):
def __init__(self, filename, file_path):
self.file_name = filename
self.file_path = file_path
"""
excel自動(dòng)轉(zhuǎn)透視表功能
返回透視結(jié)果
"""
def excel_Pivot(self):
print(self.file_path)
data = pd.read_excel(self.file_path)
data_pivot_table = pd.pivot_table(data, index=['供應(yīng)商名稱', '月份'], values=["入庫金額"], aggfunc=np.sum)
return data_pivot_table
"""
按條件篩選,并保存
"""
def select_data(self, name, month):
data_pivot_table = self.excel_Pivot()
data_new = data_pivot_table.query('供應(yīng)商名稱 == ["{}"] & 月份 == {}'.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/' + filename
pross = ExcelToPivot(filename, path)
print(pross.select_data("C", 4))
設(shè)計(jì)桌面窗口功能,文件名:opration.py
from tkinter import Tk, Entry, Button, mainloop
import tkinter.filedialog
import excel_to_pivot
from tkinter import messagebox
from tkinter import ttk
def Upload():
global filename, data_pivot_table
try:
filename = tkinter.filedialog.askopenfilename(title='選擇文件')
pross = excel_to_pivot.ExcelToPivot(str(filename).split('/')[-1], filename)
data_pivot_table = pross.excel_Pivot()
messagebox.showinfo('Info', '轉(zhuǎn)換成功!')
except Exception as e:
print(e)
messagebox.showinfo('Info', '轉(zhuǎn)換失敗!')
def select(name, month):
try:
print('供應(yīng)商名稱 == ["{}"] & 月份 == {}'.format(name, month))
data_new = data_pivot_table.query('供應(yīng)商名稱 == ["{}"] & 月份 == {}'.format(name, month))
data_new.to_excel('{}.xlsx'.format(str(filename).split('.')[0]))
messagebox.showinfo('Info', '篩選完成并生成文件!')
root.destroy()
except Exception as e:
print(e)
messagebox.showinfo('Info', '篩選失??!')
root = Tk()
root.config(background="#6fb765")
root.title('自動(dòng)轉(zhuǎn)透視表小工具')
root.geometry('500x250')
e1 = Entry(root, width=30)
e1.grid(row=2, column=0)
btn1 = Button(root, text=' 上傳文件 ', command=Upload).grid(row=2, column=10, pady=5)
box1 = ttk.Combobox(root)
# 使用 grid() 來控制控件的位置
box1.grid(row=5, sticky="NW")
# 設(shè)置下拉菜單中的值
box1['value'] = ('A', 'B', 'C', 'D', '供應(yīng)商')
# 通過 current() 設(shè)置下拉菜單選項(xiàng)的默認(rèn)值
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, '月份')
box2.current(12)
# 編寫回調(diào)函數(shù),綁定執(zhí)行事件
def func(event):
global b1, b2
b1 = box1.get()
b2 = box2.get()
# 綁定下拉菜單事件
box1.bind("<<ComboboxSelected>>", func)
box2.bind("<<ComboboxSelected>>", func)
btn2 = Button(root, text=' 篩選數(shù)據(jù) ', command=lambda: select(b1, b2)).grid(row=30, column=10, pady=5)
mainloop()
如果運(yùn)行結(jié)果如上,說明代碼沒有問題了,可以進(jìn)行下一步。
打包 Python 程序生成 exe
打開 DOS 窗口并切換到 兩個(gè) py 文件所在的目錄,注意路徑中不要有中文。
pyinsatller -F -w opration.py
pyinstaller 指令的常見可選參數(shù):
- -i 給應(yīng)用程序添加圖標(biāo)
- -F 指定打包后只生成一個(gè)exe格式的文件
- -D –onedir 創(chuàng)建一個(gè)目錄,包含exe文件,但會(huì)依賴很多文件(默認(rèn)選項(xiàng))
- -c –console, –nowindowed 使用控制臺(tái),無界面(默認(rèn))
- -w –windowed, –noconsole 使用窗口,無控制臺(tái)
- -p 添加搜索路徑
在當(dāng)前的目錄下,將會(huì)生成兩個(gè)文件夾:build 和 dist。dist 里面就是所有可執(zhí)行 exe 文件,發(fā)送快捷方式到桌面,點(diǎn)擊 opration.exe 就能運(yùn)行了,可以發(fā)它的快捷方式發(fā)送到桌面,雙擊就可以。
解決 exe 文件可能過大問題
有的伙伴 Python 環(huán)境剛安裝沒多久,可能不存在這個(gè)文件過大的問題。像我的電腦里安裝了 Python 很多的依賴包和 anaconda 等等,打包出來的文件居然 660M,打包時(shí)間長,執(zhí)行時(shí)還卡,后來經(jīng)過整改縮小到 31M,打包快,秒級執(zhí)行。解決方案是在 Windows 系統(tǒng)下安裝一個(gè) Python 的虛擬環(huán)境,前提是已經(jīng)在電腦上安裝過 Python 才可以進(jìn)行如下操作。
找到 Python 所在路徑,如果忘記了,可以在電腦左下角搜索【編輯系統(tǒng)環(huán)境變量】——【用戶變量】——【PATH】中找到
配置虛擬環(huán)境
虛擬環(huán)境可以理解為是 Python 解釋器的一個(gè)副本,在這個(gè)環(huán)境你可以安裝私有包,而且不會(huì)影響系統(tǒng)中安裝的全局 Python 解釋器。虛擬環(huán)境非常有用,可以在系統(tǒng)的 Python 解釋器中避免包的混亂和版本的沖突。
重要是不同虛擬環(huán)境可以搭建不同的 Python 版本,創(chuàng)建時(shí)候選擇,我們這里需要一個(gè)相對 "干凈" 的 Python 環(huán)境,沒有安裝過多依賴包,避免 exe 打包文件過大,所以用到虛擬環(huán)境。
安裝虛擬環(huán)境依賴包
pip install virtualenv
pip install virtualenvwrapper-win
創(chuàng)建虛擬環(huán)境命令
mkvirtualenv -p="C:\Users\cherich\AppData\Local\Programs\Python\Python38\python.exe" py38
進(jìn)入虛擬環(huán)境,可以看到只有幾個(gè)默認(rèn)的 Python 庫
這時(shí)可以測試一下代碼,是否缺少相關(guān)依賴,比如我這個(gè)缺少 Pandas,openpyxl,依次按照 pip install 包名安裝即可,非常重要的點(diǎn):pyinstaller 必須重新安裝,文件才會(huì)縮小。
上述操作完成后,打包就可以了,最后退出虛擬環(huán)境即可。
退出虛擬環(huán)境
deactivate
整個(gè)自動(dòng)化思路的實(shí)現(xiàn)就完成了,大家可以將整個(gè)流程套用到你現(xiàn)有的重復(fù)性工作中,在過程中有兩個(gè)需要注意的點(diǎn),如下:
盡量不要用中文路徑,要不會(huì)報(bào)些莫名其妙的錯(cuò)誤。
導(dǎo)包是盡量避免使用 import * 導(dǎo)入不必要的包,節(jié)省打包和執(zhí)行時(shí)間。
讓代碼自動(dòng)工作,省下來的時(shí)間,摸摸魚,打打小游戲不好么~