效果圖
寫在前面事情是這樣子的,昨天回去無意看了一下女朋友桌面,密密麻麻的全是文件,各式各樣的佔滿屏幕,簡直要把我這個強迫症給難受死,讓她整理一下,還懶的整理。於是中午沒休息寫了一個文件整理工具給這個懶豬,希望她能夠識抬舉,給我點獎勵~哈哈廢話不多說,進入正題!
主要涉及到的庫:
tkinter:實現 GUI 編程(文本框、按鈕、標籤等組件實現 GUI 開發)。pathlib:面向對象的編程方式來表示文件系統路徑。ttkthemes:tkinter 主題包,讓你的組件外觀更加騷。Pyinstaller:是一個非常簡單的打包 .py 文件的庫。本文實現的文件整理實際是一種文件分類的功能,將指定文件夾下的文件進行分類,並移動到該類別的文件夾下。
首先需要定義一個文件類型的字典,來指定每個類別文件有哪些。
FILE_TYPE = {
"圖片": [".jpeg", ".jpg", ".tiff", ".gif", ".bmp", ".png", ".bpg", "svg",
".heif", ".psd", ".raw"],
"視頻": [".avi", ".flv", ".wmv", ".mov", ".mp4", ".webm", ".vob", ".mng",
".qt", ".mpg", ".mpeg", ".3gp", ".mkv"],
"文檔": [".oxps", ".epub", ".pages", ".docx", ".doc", ".fdf", ".ods",
".odt", ".pwi", ".xsn", ".xps", ".dotx", ".docm", ".dox",
".rvg", ".rtf", ".rtfd", ".wpd", ".xls", ".xlsx", ".ppt",
"pptx",".csv",",pdf", ],
"壓縮文件": [".a", ".ar", ".cpio", ".iso", ".tar", ".gz", ".rz", ".7z",
".dmg", ".rar", ".xar", ".zip"],
"影音": [".aac", ".aa", ".aac", ".dvf", ".m4a", ".m4b", ".m4p", ".mp3",
".msv", ".ogg", ".oga", ".raw", ".vox", ".wav", ".wma"],
"編程": [".py",".html5", ".html", ".htm", ".xhtml",".c",".cpp",".java",".css", ".ipynb", ".h", '.class'],
"可執行程序": [".exe"],
}整體代碼的邏輯十分簡單:遍歷指定文件夾下的文件,忽略文件夾,只獲取文件,判斷文件類型是否在文件夾中出現,如果出現則移動到指定文件夾中(不存在文件夾則創建),否則歸類到其他文件中。
from pathlib import Path
dir_path = r'C:\Users\pc\Desktop\test'
# 遍歷指定文件夾下的文件,忽略文件夾
for file_path in Path(dir_path).glob('*.*'):
temp = 0 # 標誌是否已經通過FILE_TYPE分類
for key, value in FILE_TYPE.items():
if file_path.suffix in value:
sub_dir = Path(dir_path, key) # 某類文件夾路徑
if not sub_dir.exists():
sub_dir.mkdir(exist_ok=True) # 創建文件夾
file_path.rename(Path(sub_dir, file_path.name)) # 移動文件
temp = 1
break
if temp == 0:
sub_dir = Path(dir_path, '其他文件')
if not sub_dir.exists():
sub_dir.mkdir(exist_ok=True) # 創建保存沒有被識別文件的文件夾
file_path.rename(Path(sub_dir, file_path.name)) # 移動文件
實現 GUI 界面實現 GUI 界面時在原有功能上添加了一個還原按鈕,能夠撤銷文件整理的操作。
設置界面主題樣式window = ThemedTk(theme="adapta", fonts=True, themebg=True)自定義 Label 樣式
label_style = ttk.Style()
label_style.configure("Label", font=("微軟雅黑", 22, 'bold'), foreground="red", background="yellow")添加 Label 標籤,並使用自定義的樣式
# 添加標籤
label = tk.Label(window, text='♥向日葵的專屬 sun♥', style='Label')
添加選擇路徑組件及功能實現# 設置選擇路徑組件
path = tk.StringVar()
entry = ttk.Entry(window, textvariable=path, width=30)
button1 = ttk.Button(window,width=10, text = "選擇路徑", command = selectPath)點擊 「選擇路徑」 按鈕,執行 selectPath() 函數,將選擇的文件夾路徑傳遞給 entry 來顯示在界面上
def selectPath():
global dir_path
# 選擇文件path接收文件地址
dir_path = filedialog.askdirectory(title='選擇待整理的文件夾')
# 通過replace函數替換絕對文件地址中的/來使文件可被程序讀取
dir_path.replace("/", r"\\")
path.set(dir_path)
添加「整理」,「撤銷」組件及功能實現# 添加「整理」按鈕
button2 = ttk.Button(window,width=10, text = "整理", command = organize_files)
# 添加「還原」按鈕
button3 = ttk.Button(window,width=10, text = "還原", command = cancle_organize)點擊「整理」按鈕,執行 organize_files() 函數,實現文件整理,並記錄文件原路徑與新路徑,同時也要記錄新創建的文件夾路徑,因為還原操作時要將新創建的文件夾進行刪除。
def organize_files():
if dir_path == '':
tree.heading("#0", text="還未選取路徑哦")
return None
global organize_temp
organize_temp = 1
# 遍歷指定文件夾下的文件,忽略文件夾
for file_path in Path(dir_path).glob('*.*'):
temp = 0 # 標誌是否已經通過FILE_TYPE繼續分類
for key, value in FILE_TYPE.items():
if file_path.suffix in value:
sub_dir = Path(dir_path, key) # 某類文件夾路徑
if not sub_dir.exists():
sub_dir.mkdir(exist_ok=True) # 創建文件夾
create_dir_path.append(sub_dir)
file_path.rename(Path(sub_dir, file_path.name)) # 移動文件
old_file_path[Path(sub_dir, file_path.name)] = file_path
temp = 1
break
if temp == 0:
sub_dir = Path(dir_path, '其他文件')
if not sub_dir.exists():
sub_dir.mkdir(exist_ok=True) # 創建保存沒有被識別文件的文件夾
create_dir_path.append(sub_dir)
file_path.rename(Path(sub_dir, file_path.name)) # 移動文件
old_file_path[Path(sub_dir, file_path.name)] = file_path
tree.heading("#0", text="整理完成")點擊「還原」按鈕,執行 cancle_organize() 函數,還原文件至整理之前
def cancle_organize():
if organize_temp == 0:
tree.heading("#0", text="還未整理哦")
return None
for new_path, old_path in old_file_path.items():
new_path.rename(old_path) # 還原文件
for dir_path in create_dir_path:
dir_path.rmdir() # 不能使用unlink()來刪除,報錯無權限
tree.heading("#0", text="還原成功")
添加輸出框顯示運行後的信息# 添加輸出框顯示
tree = ttk.Treeview(height=1, show=("tree", "headings"))
設置各個組件在界面的位置# 設置組件位置
label.grid(row=0, column=0, padx=20, pady=40)
entry.grid(row = 3, column = 0, pady=5)
button1.grid(row = 3, column = 1, padx=20)
button2.grid(row = 4, column = 0, pady=5)
button3.grid(row = 5, column = 0, pady=5)
tree.grid(row=6, column=0, pady=5)至此,一個文件整理的小工具就已經實現了。整體界面如下:
源碼打包首先要確保已經安裝 pyinstaller,沒有安裝的可以先安裝一下。
pip install -i https://pypi.douban.com/simple pyinstallerpyinstaller 使用時的常用參數含義:
-F:打包單個文件,產生一個文件用於部署(默認),如果代碼都寫在一個 .py 文件時使用,項目有多個文件時不要使用
pyinstaller -F xxx.py
-D:打包多個文件,產生一個目錄用於部署(默認),用於框架編寫的代碼打包
pyinstaller -D xxx.py(項目入口文件)
--key=keys:使用 keys 進行加密打包
pyinstaller --key=123456 -F xxx.py
-d:產生 debug 版本的可執行文件
-p:用來添加程序所用到的包的所在位置,設置導入路徑,可以用 ; ( Linux 使用 :)分割來指定多個目錄。
-w:表示不用控制臺窗口,使用 Windows 子系統執行,當程序啟動的時候不會打開命令行(只對 Windows 有效)
-c:表示打開控制臺窗口,使用控制臺子系統執行,當程序啟動的時候會打開命令行(默認)(只對 Windows 有效)
-i:將 file.ico 添加為可執行文件的資源,改變程序的圖標(只對 Windows 系統有效)
安裝完成後,新建一個文件夾,將源文件放到該文件夾下面,打開cmd, cd 進入該文件夾下(重點),執行下面語句
生成的文件結構如下
exe 可執行文件在 dist 目錄下
到這裡就可以把 .exe 文件發送別人了,並且可以在沒有任何配置的情況下運行哦~(前提是同樣是 Windows 下)這裡的圖標是我自己在網上找的。如果沒有 ico 格式的圖標的話,推薦一個免費的 icon 網站:https://iconstore.co/然後在 https://www.aconvert.com/cn/icon/svg-to-ico/ 轉換成指定大小的 ico 圖標。
最後文章中的源碼及打包後的文件已經上傳,後臺回復 「文件整理工具」 即可獲取。