国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

政府類門戶網(wǎng)站cms抖音推廣引流

政府類門戶網(wǎng)站cms,抖音推廣引流,dz論壇中英文網(wǎng)站怎么做,國際新聞界【Python】 打造高效文件分類工具 一、代碼整體結構二、關鍵代碼解析(一)初始化部分(二)界面創(chuàng)建部分(三)核心功能部分(四)其他輔助功能部分 三、運行與使用四、示圖五、作者有話說 …

【Python】 打造高效文件分類工具

    • 一、代碼整體結構
    • 二、關鍵代碼解析
      • (一)初始化部分
      • (二)界面創(chuàng)建部分
      • (三)核心功能部分
      • (四)其他輔助功能部分
    • 三、運行與使用
    • 四、示圖
    • 五、作者有話說

該代碼基于 Python 的 tkinter 庫實現(xiàn)了 “文件分類工具 - 優(yōu)化版” 圖形化桌面應用。用戶能通過界面選擇文件夾和要分類的文件類型,支持全選或自定義部分文件擴展名進行分類。采用多線程技術執(zhí)行文件整理任務,避免界面卡頓且可中途停止。利用 os.scandir 高效遍歷文件并批量分組處理,對大文件(超 500MB)增加延遲處理并記錄日志。通過消息隊列記錄整理過程,包含跳過文件、移動文件及錯誤信息等,支持將日志保存為文本文件。整理完成后顯示總文件數(shù)、成功移動數(shù)、失敗次數(shù)和跳過文件數(shù)等統(tǒng)計信息,還可直接打開整理后的文件夾查看結果。

一、代碼整體結構

我們的文件分類工具基于 Python 的 Tkinter 庫構建,Tkinter 是 Python 的標準 GUI(Graphical User Interface,圖形用戶界面)庫,它提供了豐富的組件來創(chuàng)建交互式應用程序。整個代碼圍繞一個名為FileOrganizerApp的類展開,這個類負責管理界面元素、用戶交互以及文件整理的核心邏輯。

二、關鍵代碼解析

(一)初始化部分

class FileOrganizerApp:def __init__(self, root):self.root = rootself.root.title("文件分類工具-優(yōu)化版")self.root.geometry("800x600")# 初始化統(tǒng)計變量self.total_files = 0self.moved_count = 0self.error_count = 0self.current_progress = 0# 初始化文件類型選擇相關變量self.all_files_var = tk.BooleanVar()self.checkbox_vars = {}self.checkboxes = {}self.preset_extensions = ["txt", "doc", "docx", "pdf", "jpg","png", "gif", "mp3", "mp4", "xls","xlsx", "zip", "rar", "ppt", "pptx"]# 創(chuàng)建消息隊列self.log_queue = queue.Queue()self.create_widgets()self.running = Falseself.stop_event = threading.Event()

在__init__ 方法中,我們首先設置了應用程序窗口的標題和初始大小。接著,初始化了一系列統(tǒng)計變量,用于記錄整理過程中的文件總數(shù)、成功移動的文件數(shù)、出錯的文件數(shù)以及當前的進度。
為了讓用戶能夠選擇要分類的文件類型,我們定義了all_files_var布爾變量用于全選功能,checkbox_vars字典來存儲每個文件擴展名對應的復選框狀態(tài),checkboxes字典用于存儲復選框組件,preset_extensions列表則列出了我們預設支持分類的文件擴展名。
消息隊列l(wèi)og_queue用于在不同線程間傳遞日志信息,確保界面的流暢更新。最后,調用create_widgets方法創(chuàng)建界面元素,并初始化一些控制變量。

(二)界面創(chuàng)建部分

def create_widgets(self):# 文件夾選擇部分frame_top = ttk.Frame(self.root, padding=10)frame_top.pack(fill=tk.X)self.btn_select = ttk.Button(frame_top, text="選擇文件夾", command=self.select_directory)self.btn_select.pack(side=tk.LEFT, padx=5)self.path_var = tk.StringVar()self.entry_path = ttk.Entry(frame_top, textvariable=self.path_var, width=60)self.entry_path.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)# 文件類型選擇部分type_frame = ttk.LabelFrame(self.root, text="選擇要分類的文件類型", padding=10)type_frame.pack(fill=tk.BOTH, expand=True, pady=5)# 全選復選框ttk.Checkbutton(type_frame,text="全部分類",variable=self.all_files_var,command=self.toggle_checkboxes).grid(row=0, column=0, sticky=tk.W, padx=5)# 創(chuàng)建擴展名復選框for idx, ext in enumerate(self.preset_extensions):self.checkbox_vars[ext] = tk.BooleanVar()cb = ttk.Checkbutton(type_frame,text=ext.upper(),variable=self.checkbox_vars[ext])cb.grid(row=idx // 5 + 1, column=idx % 5, sticky=tk.W, padx=5)self.checkboxes[ext] = cb# 控制按鈕部分frame_controls = ttk.Frame(self.root, padding=10)frame_controls.pack(fill=tk.X)self.btn_start = ttk.Button(frame_controls, text="開始整理", command=self.start_organize)self.btn_start.pack(side=tk.LEFT, padx=5)self.btn_stop = ttk.Button(frame_controls, text="停止", command=self.stop_organize, state=tk.DISABLED)self.btn_stop.pack(side=tk.LEFT, padx=5)# 保存日志按鈕self.btn_save_log = ttk.Button(frame_controls, text="保存日志", command=self.save_log, state=tk.DISABLED)self.btn_save_log.pack(side=tk.LEFT, padx=5)# 查看文件按鈕,初始狀態(tài)為禁用self.btn_view_files = ttk.Button(frame_controls, text="查看文件", command=self.open_folder, state=tk.DISABLED)self.btn_view_files.pack(side=tk.LEFT, padx=5)# 日志顯示部分frame_log = ttk.Frame(self.root, padding=10)frame_log.pack(fill=tk.BOTH, expand=True)self.log_area = scrolledtext.ScrolledText(frame_log, wrap=tk.WORD)self.log_area.pack(fill=tk.BOTH, expand=True)# 進度條self.progress = ttk.Progressbar(self.root, orient=tk.HORIZONTAL, mode='determinate')self.progress.pack(fill=tk.X, padx=10, pady=5)

create_widgets方法負責構建應用程序的整個界面。它分為幾個主要部分:

  1. 文件夾選擇部分:包含一個按鈕btn_select用于打開文件選擇對話框,以及一個輸入框entry_path用于顯示用戶選擇的文件夾路徑。
  2. 文件類型選擇部分:通過一個標簽框架type_frame包含一個全選復選框和多個文件擴展名復選框。全選復選框的command參數(shù)綁定到toggle_checkboxes方法,用于切換所有擴展名復選框的狀態(tài)。
  3. 控制按鈕部分:包括開始整理按鈕btn_start、停止按鈕btn_stop(初始狀態(tài)為禁用)、保存日志按鈕btn_save_log(初始狀態(tài)為禁用)和查看文件按鈕btn_view_files(初始狀態(tài)為禁用)。這些按鈕分別綁定到對應的功能方法。
  4. 日志顯示部分:使用scrolledtext.ScrolledText組件創(chuàng)建一個可滾動的文本區(qū)域log_area,用于顯示文件整理過程中的日志信息。
  5. 進度條部分:通過ttk.Progressbar創(chuàng)建一個水平進度條progress,用于直觀展示文件整理的進度。

(三)核心功能部分

def start_organize(self):if not self.path_var.get():messagebox.showwarning("警告", "請先選擇要整理的文件夾")returnif self.running:returnself.running = Trueself.stop_event.clear()self.btn_start['state'] = tk.DISABLEDself.btn_stop['state'] = tk.NORMALself.btn_save_log['state'] = tk.DISABLEDself.btn_view_files['state'] = tk.DISABLEDself.progress['value'] = 0self.log_area.delete(1.0, tk.END)# 啟動隊列處理self.process_log_queue()self.update_progress()worker = threading.Thread(target=self.organize_files, daemon=True)worker.start()

start_organize方法是啟動文件整理流程的入口。首先,它檢查用戶是否選擇了要整理的文件夾路徑,如果沒有則彈出警告框提示用戶。然后,檢查當前是否已經在運行整理任務,如果是則直接返回。

接著,設置運行狀態(tài)變量running為True,清除停止事件stop_event,并根據(jù)任務狀態(tài)更新界面按鈕的狀態(tài),清空進度條和日志區(qū)域。

為了確保日志能夠及時更新,調用process_log_queue方法啟動日志隊列處理,同時調用update_progress方法開始更新進度條。最后,創(chuàng)建一個新的線程來執(zhí)行核心的文件整理邏輯organize_files,并將線程設置為守護線程,這樣當主線程結束時,該線程也會自動結束。

def organize_files(self):target_dir = self.path_var.get()try:# 使用更高效的scandir遍歷文件files = []with os.scandir(target_dir) as entries:for entry in entries:if entry.is_file():files.append(entry.name)self.total_files = len(files)processed_files = 0# 批量分組處理文件selected_exts = Noneif not self.all_files_var.get():selected_exts = {ext for ext, var in self.checkbox_vars.items() if var.get()}file_groups = defaultdict(list)skipped_count = 0for filename in files:if self.stop_event.is_set():break_, ext = os.path.splitext(filename)ext = ext.lower().lstrip('.') if ext else 'no_extension'if selected_exts is None or ext in selected_exts:file_groups[ext].append(filename)else:skipped_count += 1# 處理跳過的文件self.log_queue.put(f"已跳過 {skipped_count} 個未選類型的文件")# 批量移動文件total_to_process = sum(len(v) for v in file_groups.values())processed = 0for ext, filenames in file_groups.items():if self.stop_event.is_set():breakdest_dir = os.path.join(target_dir, ext)os.makedirs(dest_dir, exist_ok=True)for filename in filenames:if self.stop_event.is_set():breakfile_path = os.path.join(target_dir, filename)try:# 大文件處理(超過500MB時增加延遲)file_size = os.path.getsize(file_path)if file_size > 500 * 1024 * 1024:self.log_queue.put(f"正在處理大文件: {filename} ({file_size // 1024 // 1024}MB)")time.sleep(0.5)shutil.move(file_path, os.path.join(dest_dir, filename))self.moved_count += 1# 每處理50個文件更新一次日志if self.moved_count % 50 == 0:self.log_queue.put(f"已移動 {self.moved_count} 個文件")except Exception as e:self.error_count += 1self.log_queue.put(f"錯誤: {filename} ({str(e)})")processed += 1self.current_progress = (processed / total_to_process) * 100self.root.after(10, self.organize_complete)except Exception as e:self.log_queue.put(f"系統(tǒng)錯誤: {str(e)}")self.root.after(10, self.organize_complete)

organize_files方法是文件分類的核心邏輯所在。它首先獲取用戶選擇的目標文件夾路徑target_dir。然后,使用os.scandir函數(shù)更高效地遍歷目標文件夾中的所有文件,將文件列表存儲在files變量中,并記錄文件總數(shù)total_files。

接下來,根據(jù)用戶在界面上選擇的文件類型進行分組處理。如果用戶選擇了全部分類(all_files_var為True),則selected_exts為None,表示處理所有文件;否則,通過列表推導式獲取用戶勾選的文件擴展名集合selected_exts。
使用defaultdict創(chuàng)建file_groups字典,將文件按擴展名分組。在遍歷文件過程中,如果文件類型不在用戶選擇的范圍內,則跳過該文件并記錄跳過的文件數(shù)。

在批量移動文件階段,首先計算需要處理的文件總數(shù)total_to_process。對于每個文件組,創(chuàng)建對應的目標文件夾(如果不存在),然后逐個移動文件。在移動文件時,增加了對大文件(超過 500MB)的處理邏輯,當遇到大文件時,在日志中記錄并增加 0.5 秒的延遲,以避免在處理大文件時導致系統(tǒng)卡頓。同時,每成功移動 50 個文件,在日志中記錄已移動的文件數(shù)。如果移動過程中出現(xiàn)錯誤,記錄錯誤信息并增加錯誤計數(shù)。

在整個過程中,根據(jù)已處理文件數(shù)和總文件數(shù)實時更新當前進度current_progress。最后,通過root.after方法在 10 毫秒后調用organize_complete方法,用于處理整理完成后的后續(xù)操作。

(四)其他輔助功能部分

def stop_organize(self):self.stop_event.set()self.log_queue.put("正在停止整理進程...")

stop_organize方法用于停止文件整理任務。它通過設置stop_event事件,通知正在執(zhí)行文件整理的線程停止操作,并在日志隊列中添加停止進程的提示信息。

def process_log_queue(self):try:while True:msg = self.log_queue.get_nowait()self.log_area.insert(tk.END, msg + "\n")self.log_area.see(tk.END)except queue.Empty:passself.root.after(100, self.process_log_queue)

process_log_queue方法負責從日志隊列l(wèi)og_queue中獲取日志信息,并將其顯示在日志區(qū)域log_area中。它通過一個循環(huán)不斷嘗試從隊列中獲取消息,使用get_nowait方法避免阻塞。如果隊列為空,捕獲queue.Empty異常并跳過。每次獲取并顯示消息后,通過root.after方法設置 100 毫秒后再次調用自身,以實現(xiàn)實時更新日志。

def update_progress(self):self.progress['value'] = self.current_progressself.root.after(100, self.update_progress)

update_progress方法用于更新進度條的顯示。它將當前進度current_progress的值設置到進度條progress上,并通過root.after方法設置 100 毫秒后再次調用自身,以實現(xiàn)進度條的實時更新。

def organize_complete(self):self.running = Falseself.btn_start['state'] = tk.NORMALself.btn_stop['state'] = tk.DISABLEDself.btn_save_log['state'] = tk.NORMAL# 整理完成后啟用查看文件按鈕self.btn_view_files['state'] = tk.NORMALself.current_progress = 100stats_message = (f"\n整理完成:\n"f"總文件數(shù): {self.total_files}\n"f"成功移動: {self.moved_count}\n"f"失敗次數(shù): {self.error_count}\n"f"跳過文件: {self.total_files - self.moved_count - self.error_count}")self.log_queue.put(stats_message)messagebox.showinfo("整理統(tǒng)計", stats_message)

organize_complete方法在文件整理完成后被調用。它首先將運行狀態(tài)變量running設置為False,并恢復界面按鈕的初始狀態(tài),啟用開始按鈕、禁用停止按鈕、啟用保存日志按鈕和查看文件按鈕。同時,將進度條設置為 100%。
然后,生成整理統(tǒng)計信息字符串stats_message,包含總文件數(shù)、成功移動的文件數(shù)、失敗次數(shù)和跳過的文件數(shù)。將統(tǒng)計信息添加到日志隊列中,并通過messagebox.showinfo彈出對話框顯示整理統(tǒng)計結果。

def save_log(self):log_text = self.log_area.get(1.0, tk.END)file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt")])if file_path:try:with open(file_path, 'w', encoding='utf-8') as f:f.write(log_text)messagebox.showinfo("保存成功", "日志已成功保存。")except Exception as e:messagebox.showerror("保存失敗", f"保存日志時出現(xiàn)錯誤:{str(e)}")

save_log方法用于將日志區(qū)域中的內容保存為文本文件。它首先獲取日志區(qū)域的所有文本內容log_text,然后通過filedialog.asksaveasfilename打開文件保存對話框,讓用戶選擇保存路徑和文件名。如果用戶選擇了保存路徑,嘗試將日志內容寫入文件。如果保存成功,彈出提示框告知用戶;如果保存過程中出現(xiàn)錯誤,捕獲異常并彈出錯誤提示框。

def open_folder(self):folder = self.path_var.get()if folder:try:if os.name == 'nt':  # Windows 系統(tǒng)os.startfile(folder)elif os.name == 'posix':  # Linux 或 macOS 系統(tǒng)webbrowser.open(folder)except Exception as e:messagebox.showerror("錯誤", f"打開文件夾時出錯: {str(e)}")

open_folder方法用于在文件整理完成后,打開用戶選擇的目標文件夾。它
首先獲取用戶在界面上選擇的文件夾路徑folder。如果路徑存在,根據(jù)當前操作系統(tǒng)類型進行不同的操作:對于 Windows 系統(tǒng),使用os.startfile函數(shù)打開文件夾;對于 Linux 或 macOS 系統(tǒng),使用webbrowser.open函數(shù)打開文件夾。如果在打開過程中出現(xiàn)異常,捕獲異常并通過messagebox.showerror彈出錯誤提示框,告知用戶打開文件夾時出現(xiàn)的錯誤信息。

三、運行與使用

當你運行這段代碼時,會彈出一個圖形化界面的文件分類工具窗口。在窗口中,你可以通過點擊 “選擇文件夾” 按鈕選擇需要整理文件的文件夾路徑,該路徑會顯示在輸入框中。

在 “選擇要分類的文件類型” 區(qū)域,你可以選擇 “全部分類”,也可以單獨勾選需要分類的文件擴展名類型,如 “TXT”“JPG”“PDF” 等。完成選擇后,點擊 “開始整理” 按鈕,工具將開始掃描文件夾內的文件,并按照你選擇的類型進行分類整理。

在整理過程中,進度條會實時顯示整理進度,日志區(qū)域會記錄整理過程中的詳細信息,包括每個文件的處理情況、錯誤信息等。如果在整理過程中你想停止操作,可以點擊 “停止” 按鈕。整理完成后,你可以點擊 “保存日志” 按鈕將整理過程中的日志信息保存為文本文件,也可以點擊 “查看文件” 按鈕直接打開整理后的文件夾查看分類結果。

四、示圖

在這里插入圖片描述

五、作者有話說

代碼功能已經過嚴格測試,確認無誤。然而,值得注意的是,測試集的大小僅為3個G,相對而言規(guī)模較小,因此無法百分之百保證在所有情況下均無任何問題。鑒于此,強烈建議在使用之前做好數(shù)據(jù)備份,以防萬一出現(xiàn)數(shù)據(jù)丟失的情況。如果您在使用過程中發(fā)現(xiàn)任何bug或問題,歡迎隨時留言反饋,作者將及時響應并進行相應的修改。

http://m.aloenet.com.cn/news/44011.html

相關文章:

  • 青島網(wǎng)站建設全包谷歌seo是做什么的
  • 網(wǎng)站怎么推廣網(wǎng)絡營銷是以什么為基礎
  • 高創(chuàng)園網(wǎng)站建設方案怎樣制作網(wǎng)站
  • 宿遷裝飾網(wǎng)站建設公司排名seo是什么工作內容
  • 網(wǎng)站建設服務費屬于站長工具是什么
  • 成都 企業(yè)網(wǎng)站建設公司價格百度站長管理平臺
  • 臺州做網(wǎng)站的公司seo優(yōu)化實訓總結
  • github做網(wǎng)站空間地推掃碼平臺
  • wordpress 焦點圖seo搜索引擎優(yōu)化課程
  • 優(yōu)秀網(wǎng)站設計書籍微信公眾號平臺官網(wǎng)
  • 返利網(wǎng)網(wǎng)站怎么做北京seo推廣服務
  • 深圳龍華大浪做網(wǎng)站公司知乎營銷平臺
  • 做搜狗手機網(wǎng)站快速排十大中文網(wǎng)站排名
  • 做網(wǎng)站首頁需要什么資料推廣app用什么平臺比較好
  • 太原自助建站軟件快速排名教程
  • 石家莊做網(wǎng)站的公司有哪些足球世界排名一覽表
  • 網(wǎng)站開發(fā)3687474企鵝網(wǎng)絡營銷的種類
  • 做網(wǎng)站哪個公司可以做seo收錄排名
  • 網(wǎng)站做裂變引流周口網(wǎng)絡推廣公司
  • 制作公司網(wǎng)站在公賬匯款時用途備注什么北京seo工程師
  • 網(wǎng)站建設基本內容百度一下你就知道了
  • 大連百度代理seo推廣優(yōu)化多少錢
  • 個人做網(wǎng)站的必要性軟文推廣代理平臺
  • 哪個網(wǎng)站做服裝批發(fā)比較好網(wǎng)絡口碑營銷案例
  • wordpress過濾用戶輸入數(shù)據(jù)seo管理系統(tǒng)培訓
  • 古交做網(wǎng)站今天熱搜榜前十名
  • 美國網(wǎng)站建設公司百度官方營銷推廣平臺加載中
  • 網(wǎng)站如何做前后端分離百度接單平臺
  • 阿里云服務器搭網(wǎng)站同時做網(wǎng)盤網(wǎng)絡服務器多少錢一臺
  • 公司網(wǎng)頁設計圖青島seo排名公司