1. 程式人生 > 實用技巧 >六十來行python程式碼完成一個檔案分類器

六十來行python程式碼完成一個檔案分類器

​你的桌面是否像這樣的一樣被各種檔案給堆滿了,但是每一個檔案又不清楚是否後面還有作用,也不敢刪除,自己一個一個轉移又太麻煩了。沒關係,今天我帶大家用python一起來做一個檔案歸類器,一鍵進行分類,再也不會看到滿滿當當的桌面了。

我們今天需要匯入的os、shutil、glob這三個庫,os用來對路徑的處理,shutil用來對檔案的拷貝刪除處理,glob用來對指定資料夾下的檔案進行遍歷。

# -*- coding:utf-8 -*-#author:菜鳥小白的學習分享import osimport shutilimport glo

引數獲取程式然後我們寫了一個引數獲取函式,用於處理需要檔案進行分類的路徑和存放路徑等引數的使用者輸入。

# -*- coding:utf-8 -*-#author:菜鳥小白的學習分享def getconf():    flag = "1"    print("輸入‘1’為桌面資料夾整理,其它資料夾整理請輸入完整路徑")    path=input("請輸入需要整理的資料夾:")    if path=="1":        goal_path = os.path.join(os.path.expanduser('~'), "Desktop")    else:        goal_path = path        flag = input("是否需要保留原檔案(此項配置僅針對非桌面資料夾有效),保留請輸入‘1’,不保留請輸入‘2’:")
mkdir_path=input("請輸入整理後的檔案存放路徑:") if not os.path.exists(mkdir_path): os.mkdir(mkdir_path) return goal_path,mkdir_path,flag

檔案處理程式 因為桌面資料夾和普通資料夾不一樣,桌面檔案上存在著大量的可執行程式和快捷方式,我們無需將這一部分的檔案進行歸類處理。所以我這裡將桌面資料夾和普通資料夾分開進行了處理。我們先看看普通資料夾的處理方式。

# -*- coding:utf-8 -*-#author:菜鳥小白的學習分享def FileHandle(goal_path,mkdir_path,flag):
file_num = 0 path_num = 0 for file in glob.glob(f'{goal_path}/**/*', recursive=True): if os.path.isfile(file): filename = os.path.basename(file) if '.' in filename: suffix = filename.split('.')[-1] else: suffix = 'others' if not os.path.exists(f'{mkdir_path}/{suffix}'): os.mkdir(f'{mkdir_path}/{suffix}') path_num += 1 shutil.copy(file, f'{mkdir_path}/{suffix}') file_num += 1 if flag=="2": shutil.rmtree(goal_path) return file_num,path_num

在對普通資料夾處理之後我們根據輸入的flag引數判斷是否需要保留原檔案,若不需保留的話,我們就刪除目標資料夾及其下屬的所有檔案內容。

# -*- coding:utf-8 -*-#author:菜鳥小白的學習分享    if flag=="2":shutil.rmtree(goal_path)

我們再看看桌面檔案的處理方式

# -*- coding:utf-8 -*-#author:菜鳥小白的學習分享def DesktopHandle(goal_path,mkdir_path):    file_num = 0    path_num = 0    for file in glob.glob(f'{goal_path}/**/*', recursive=True):        if os.path.isfile(file):            filename = os.path.basename(file)            if '.' in filename:                suffix = filename.split('.')[-1]            else:                suffix = 'others'            if suffix=="exe" or suffix=="lnk":                pass            else:                if not os.path.exists(f'{mkdir_path}/{suffix}'):                    os.mkdir(f'{mkdir_path}/{suffix}')                    path_num += 1                shutil.copy(file, f'{mkdir_path}/{suffix}')            file_num += 1    return file_num,path_num

大體思路和普通資料夾的處理是一致的,但是在桌面檔案的處理中我們將exe和lnk字尾的檔案進行了過濾,不對它進行拷貝操作,其它檔案我們都拷貝到目標資料夾中。

 # -*- coding:utf-8 -*-#author:菜鳥小白的學習分享 if suffix=="exe" or suffix=="lnk":                pass            else:                if not os.path.exists(f'{mkdir_path}/{suffix}'):                    os.mkdir(f'{mkdir_path}/{suffix}')                    path_num += 1                shutil.copy(file, f'{mkdir_path}/{suffix}')

另外在桌面檔案的處理中我現在也沒有放上刪除原檔案的操作,若有需要的小夥伴直接在後面加上檔案刪除操作即可。

統計資訊程式

在所有的檔案都處理之後,我還弄了一個統計程式,統計一共處理了多少個檔案,建立了多少個分類資料夾。

# -*- coding:utf-8 -*-#author:菜鳥小白的學習分享def WriteInfo(mkdir_path):    file_name = mkdir_path+"\info.txt"    with open(file_name,'w',encoding='utf-8') as f:        f.write(f'整理完成,有{file_num}個檔案分類到了{path_num}個資料夾中')

主程式

最後就是我們的主程式了,分別去呼叫引數獲取程式,檔案處理程式和統計程式即可。

# -*- coding:utf-8 -*-#author:菜鳥小白的學習分享if __name__ == '__main__':    goal_path,mkdir_path,flag=getconf()    if goal_path==os.path.join(os.path.expanduser('~'), "Desktop"):        file_num,path_num=DesktopHandle(goal_path, mkdir_path)    else:        file_num,path_num=FileHandle(goal_path, mkdir_path,flag)    WriteInfo(mkdir_path)

實現效果

好了,整個程式都分析過了,最後我們看看最終的實現效果吧。

程式的執行是這樣的

桌面檔案的歸類

普通檔案的歸類

結束

有需要程式原始碼的小夥伴關注公眾號“菜鳥小白的學習分享”回覆“檔案分類器原始碼”即可獲取原始碼下載連結。

有需要程式執行檔案的小夥伴關注公眾號“菜鳥小白的學習分享”回覆“檔案分類器可執行檔案”即可獲取菜鳥小白打包好的可執行程式下載連結。

好了,今天的分享就到這裡。如果你也認同菜鳥小白的話,那就給菜鳥小白一個關注、在看、點贊+讚賞吧,你們的支援,是我持續不斷的動力。