欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python實現(xiàn)一個文件夾整理工具

 更新時間:2023年10月18日 09:48:15   作者:微小冷  
這篇文章主要為大家詳細介紹了如何基于Python實現(xiàn)一個簡單的文件夾整理工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

簡介

我們的目的是做一個像下面這樣的工具,前面兩個輸入框,用于輸入源路徑和目標路徑,下面的圖片、視頻、音樂表示在目標路徑中創(chuàng)建的文件夾,后面的文件后綴,表示將這類文件移動到對應的文件夾中,加減號可以新增或刪除文件夾。

文件夾對話框

第一步,實現(xiàn)源路徑和目標路徑的輸入輸出,從而需要自定義一個組件,代碼如下,其及具體實現(xiàn)邏輯,可以參考:自定義文件選擇按鈕

import tkinter as tk
import tkinter.ttk as ttk
from tkinter.filedialog import (askopenfilename,
    askopenfilenames, askdirectory, asksaveasfilename)
from tkinter.colorchooser import askcolor

class DialogButton(ttk.Frame):
    def __init__(self, master, 
        height, widthL, widthR, logtype, label=None, text=None, 
        frmDct={}, btnDct={}, enyDct={}, logDct={}):
        w = widthL + widthR
        super().__init__(master, 
            height=height, width = w, **frmDct)
        self.pack(fill=tk.X)

        self.text = tk.StringVar() if not text else text
        ttk.Entry(self, width=widthL, textvariable=self.text, 
            **enyDct).pack(side=tk.LEFT, fill = tk.X, expand=True)
        
        ttk.Button(self, width=widthR, 
            text=self.setLabel(logtype, label),
            command = self.Click, **btnDct).pack(side=tk.RIGHT, padx=5)
        self.logtype = logtype
        self.logDct = logDct

    def setLabel(self, key, label=None):
        if label:
            return label
        labelDct = {
            "文件"   : "選擇文件",
            "文件夾" : "選擇路徑",
            "多文件" : "選擇多個文件",
            "保存" : "存儲路徑",
            "顏色"   : "選擇顏色",
        }
        return labelDct[key]

    def Click(self):
        typeDct = {
            "文件"  : askopenfilename,
            "文件夾": askdirectory,
            "多文件": askopenfilenames,
            "保存"  : asksaveasfilename,
            "顏色"  : askcolor,
        }
        text = typeDct[self.logtype](**self.logDct)
        if self.logtype == "顏色":
            text = text[1]
        self.text.set(text)

    def get(self):
        return self.text.get()

    def set(self, txt):
        self.text.set(txt)

文件映射組件

關(guān)于文件夾整理這個功能,此前其實做過無圖形界面的版本:

Python整理下載文件夾,第一步自然是做一個文件映射字典,

F_DCT = {
    "圖片"  : [".jpg", ".png", ".jpeg", ".gif"],
    "視頻"  : [".mp4", ".mkv"],
    "音樂"  : [".mp3", ".wav"],
    "文檔"  : [".pdf"],  
    "文獻"  : [".caj"],
    "文本"  : [".csv", ".txt"],
    "源碼"  : [".py", ".c", ".cpp", ".php"],
    "office": [".docx",".xlsx", ".pptx", ".doc", ".ppt", ".xls"],
    "壓縮包": [".zip", ".tgz", ".rar", ".tar", ".7z", ".gz"],
    "安裝包": [".msi", ".exe"],
}

然后就是工具的核心內(nèi)容,文件映射組件,主要由左右兩部分組成,左側(cè)是文件夾名,右側(cè)是對應的文件后綴。從這兩個子組件出發(fā),可以為其設置初始化參數(shù)以及方法。先看源碼,再逐段解析

import tkinter as tk
import tkinter.ttk as ttk
from ctrls import DialogButton
import os
import shutil
pJoin = os.path.join
pExist = os.path.exists

from pathlib import Path

class ExFolder(ttk.Frame):
    def __init__(self, master, 
        folder=None, ex=None, dst=None, **options):
        super().__init__(master, **options)
        self.pack()

        self.folder = tk.StringVar()
        if folder : self.setFolder(folder)
        self.ex = tk.StringVar()
        if ex : self.setEx(ex)
        self.setDst(dst)

        self.initWidgets()

    def initWidgets(self):
        ttk.Entry(self, textvariable=self.folder, 
            width=10).pack(side=tk.LEFT, padx=2)    
        ttk.Entry(self, textvariable=self.ex
            ).pack(side=tk.LEFT, fill=tk.X, expand=True)

    def getFolder(self):
        return self.folder.get()

    def setFolder(self, f):
        self.folder.set(f)
    
    def getEx(self):
        exs = self.ex.get().split(",")
        for i in range(len(exs)):
            exs[i] = exs[i].strip()
        return exs
    
    def setEx(self, exs):
        if type(exs)==list:
            exs = ', '.join([ex.strip() for ex in exs])
        self.ex.set(exs)
    
    def mvFile(self, src):
        try:
            shutil.move(src, self.dst)
        except Exception as e:
            self.err = print(e)
    
    # 設置目標文件夾
    def setDst(self, dst):
        if not dst:
            self.dst = None
            return
        self.dst = pJoin(dst, self.getFolder())
        if not pExist(self.dst):
            os.makedirs(self.dst)
        self.errs = {}

首先,folder和ex分別是左右兩個組件對應的可變文本,為了便于更新和調(diào)用,類中設計了兩組、四對便攜方法getFolder, setFolder和getEx和setEx。由于Folder中的內(nèi)容就是文件夾本身,所以設置和讀取方法僅僅是StringVar的二次封裝,而ex中的內(nèi)容則不然,需要對文本進行分割,并且實現(xiàn)字符串到列表的轉(zhuǎn)換。

mvFile和setDst是組件的核心功能,分別用于設置目標路徑并移動。之所以為目標文件夾設置安排了一個獨立方法,是因為目標文件夾不一定存在,可能涉及到遞歸創(chuàng)建的過程。

完整組件

最后,是整個組件的布局,源碼如下,其中撤銷功能并未實現(xiàn)。

class FolderTools(ttk.Frame):
    def __init__(self, master, fDct=F_DCT, **options):
        super().__init__(master, **options)
        self.pack()
        self.fDct = fDct

        self.initWidgets()
        self.fEnys = []
        self.exEnys = []

    def setDct(self, fDct):
        self.fDct = fDct
        self.exDct = {}
        for k,v in self.fDct.items():
            exDct.update({ex:k for ex in v})

    def initWidgets(self):
        self.exForders = []
        pDct = dict(side=tk.TOP, expand=True, fill=tk.X)
        self.srcFolder = DialogButton(self, 5, 25, 8, 
                                      "文件夾", label="源路徑")
        self.srcFolder.pack(**pDct)
        self.dstFolder = DialogButton(self, 5, 25, 8, 
                                      "文件夾", label="目標路徑")
        self.dstFolder.pack(**pDct)

        btns = ttk.Frame(self)
        btns.pack(**pDct)
        ttk.Button(btns, text="? ", 
            command=self.btnAddFolder).grid(row=0,column=0)
        ttk.Button(btns, text="?", 
            command=self.btnDelFolder).grid(row=0,column=1)
        ttk.Button(btns, text="移動", 
            command=self.btnMove).grid(row=0,column=2)
        ttk.Button(btns, text="撤銷", 
            command=self.btnMove).grid(row=0,column=3)

        self.exFrm = ttk.LabelFrame(self, text="文件夾映射表")
        self.exFrm.pack(**pDct)

        for k, v in self.fDct.items():
            self.addFolders(self.exFrm, k, v)

    def btnAddFolder(self):
        self.addFolders(self.exFrm, None, None)

    def addFolders(self, frm, folder, exs):
        ef = ExFolder(frm, folder, exs)
        ef.pack(side=tk.TOP, expand=True, fill=tk.X, padx=2, pady=1)
        self.exForders.append(ef)

    def btnDelFolder(self):
        if len(self.exForders) == 0: return
        self.exForders[-1].pack_forget()
        del self.exForders[-1]
    
    def setExDct(self):
        self.exDct = {}
        for ef in self.exForders:
            self.exDct.update({key:ef for key in ef.getEx()})

    def btnMove(self):
        src = self.srcFolder.get()
        dst = self.dstFolder.get()
        if dst=="": dst = src

        # 設置后綴映射字典 ex:ExFolder
        exDct = {}
        for ef in self.exForders:
            exDct.update({ex:ef for ex in ef.getEx()})
            ef.setDst(dst) # 設置目標文件夾

        files = os.listdir(src)
        for f in files:
            p = pJoin(src, f)
            ex = Path(p).suffix.lower()
            if ex in exDct:
                exDct[ex].mvFile(p)

三個已經(jīng)實現(xiàn)的功能按鈕,?用于新增一個文件夾映射組件,?則移除最后一個映射組件。移除組件時需要注意,不僅僅要把組件解綁,還要把組件對應的實例刪掉。

核心功能被綁定在移動按鈕上,首先讀取源路徑和目標路徑,如果目標路徑未輸入,就在源路徑下工作。

接下來,將文件映射組件重新拆解為映射字典,最后調(diào)用對應組件的mvFile方法,實現(xiàn)所有文件的移動。

到此這篇關(guān)于基于Python實現(xiàn)一個文件夾整理工具的文章就介紹到這了,更多相關(guān)python文件夾整理工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實現(xiàn)從線程獲取返回值

    Python實現(xiàn)從線程獲取返回值

    本文介紹了Python中線程的概念、創(chuàng)建線程的方法和在線程中獲取函數(shù)返回值的技巧,線程作為進程中的執(zhí)行單元,可以實現(xiàn)程序的并發(fā)運行,文章通過示例代碼展示了如何在Python中使用Thread類創(chuàng)建線程,并講解了在線程中傳遞參數(shù)和獲取返回值的方法
    2024-09-09
  • pandas pivot_table() 按日期分多列數(shù)據(jù)的方法

    pandas pivot_table() 按日期分多列數(shù)據(jù)的方法

    今天小編就為大家分享一篇pandas pivot_table() 按日期分多列數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 解讀torch.cuda.amp自動混合精度訓練之節(jié)省顯存并加快推理速度

    解讀torch.cuda.amp自動混合精度訓練之節(jié)省顯存并加快推理速度

    這篇文章主要介紹了torch.cuda.amp自動混合精度訓練之節(jié)省顯存并加快推理速度問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Django視圖類型總結(jié)

    Django視圖類型總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于Django視圖類型的總結(jié)內(nèi)容,有興趣的朋友們可以學習下。
    2021-02-02
  • OpenCV學習方框濾波實現(xiàn)圖像處理代碼示例

    OpenCV學習方框濾波實現(xiàn)圖像處理代碼示例

    這篇文章主要為大家介紹了OpenCV學習如何使用方框濾波實現(xiàn)對圖像處理代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • python使用梯度下降算法實現(xiàn)一個多線性回歸

    python使用梯度下降算法實現(xiàn)一個多線性回歸

    這篇文章主要為大家詳細介紹了python使用梯度下降算法實現(xiàn)一個多線性回歸,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 簡單實現(xiàn)python爬蟲功能

    簡單實現(xiàn)python爬蟲功能

    這篇文章主要介紹了python實現(xiàn)簡單爬蟲功能的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2015-12-12
  • python遍歷字符串中每一個字符的4種方式

    python遍歷字符串中每一個字符的4種方式

    很多計算過程都需要每次從一個字符串中取一個字符,下面這篇文章主要給大家介紹了關(guān)于python遍歷字符串中每一個字符的4種方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • PyTorch?Autograd的核心原理和功能深入探究

    PyTorch?Autograd的核心原理和功能深入探究

    本文深入探討了PyTorch中Autograd的核心原理和功能,從基本概念、Tensor與Autograd的交互,到計算圖的構(gòu)建和管理,再到反向傳播和梯度計算的細節(jié),最后涵蓋了Autograd的高級特性
    2024-01-01
  • 基于python實現(xiàn)的百度音樂下載器python pyqt改進版(附代碼)

    基于python實現(xiàn)的百度音樂下載器python pyqt改進版(附代碼)

    這篇文章主要介紹了基于python實現(xiàn)的百度音樂下載器python pyqt改進版(附代碼),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08

最新評論