当前位置: 首页 > news >正文

【Python】实现文件移动与文件夹删除工具

【Python】 实现文件移动与文件夹删除工具

  • 一、代码整体结构
    • 界面创建
    • 选择文件夹
    • 移动并删除操作
    • 处理文件重名问题
    • 打开文件夹
  • 二、功能介绍
  • 三、 作者有话说

在日常的文件管理工作中,我们常常需要将某个文件夹下子文件夹中的文件统一移动到主文件夹,并删除这些子文件夹。 手动操作不仅繁琐,还容易出错。Python 结合 Tkinter 库可以帮助我们开发一个可视化的工具来高效完成这些任务。下面将详细介绍这个文件移动与文件夹删除工具的实现过程。

一、代码整体结构

代码围绕 FileMoverApp 类展开,该类负责创建图形用户界面(GUI)和处理文件移动与文件夹删除的核心逻辑。在初始化部分,设置了窗口的标题和大小,初始化了用于存储文件夹路径的变量,并调用 create_widgets 方法创建界面组件。

import os
import shutil
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import webbrowser


class FileMoverApp:
    def __init__(self, root):
        self.root = root
        self.root.title("文件移动与文件夹删除工具")
        self.root.geometry("400x300")

        # 初始化变量
        self.folder_path = tk.StringVar()

        # 创建界面
        self.create_widgets()

界面创建

create_widgets 方法负责创建 GUI 界面,主要包含以下几个部分:

  1. 选择文件夹部分: 提供一个文本框用于显示所选文件夹的路径,以及一个 “浏览” 按钮,点击该按钮可打开文件夹选择对话框。
  2. 执行按钮: “开始移动并删除” 按钮,点击后将触发文件移动和文件夹删除操作。
  3. 查看文件按钮: 初始状态为禁用,在操作完成后启用,点击可打开处理后的文件夹。
  4. 进度条: 用于显示文件移动的进度。
    def create_widgets(self):
        # 选择文件夹部分
        folder_frame = ttk.Frame(self.root, padding=10)
        folder_frame.pack(fill=tk.X)

        ttk.Label(folder_frame, text="选择文件夹:").pack(side=tk.LEFT)
        ttk.Entry(folder_frame, textvariable=self.folder_path, width=30).pack(side=tk.LEFT, padx=5)
        ttk.Button(folder_frame, text="浏览", command=self.select_folder).pack(side=tk.LEFT)

        # 执行按钮
        action_frame = ttk.Frame(self.root, padding=10)
        action_frame.pack(fill=tk.X)

        ttk.Button(action_frame, text="开始移动并删除", command=self.move_and_delete).pack()

        # 查看文件按钮,初始状态为禁用
        self.view_files_button = ttk.Button(action_frame, text="查看文件", command=self.open_folder, state=tk.DISABLED)
        self.view_files_button.pack(pady=10)

        # 进度条
        self.progress_bar = ttk.Progressbar(self.root, orient='horizontal', length=300, mode='determinate')
        self.progress_bar.pack(pady=10)

选择文件夹

select_folder 方法用于打开文件夹选择对话框,让用户选择要处理的文件夹,并将所选文件夹的路径存储在 folder_path 变量中。

    def select_folder(self):
        folder = filedialog.askdirectory()
        if folder:
            self.folder_path.set(folder)

移动并删除操作

move_and_delete 方法是工具的核心逻辑,主要完成以下任务:
统计文件总数:遍历所选文件夹及其子文件夹,统计所有文件的数量,用于设置进度条的最大值。
移动文件:将子文件夹中的文件移动到主文件夹,并处理文件重名问题。
删除子文件夹:在文件移动完成后,删除所有子文件夹。
错误处理:捕获并处理可能出现的权限错误、文件未找到错误等异常,并给出相应的错误提示。

    def move_and_delete(self):
        folder = self.folder_path.get()
        if not folder:
            messagebox.showwarning("警告", "请先选择文件夹")
            return

        try:
            # 统计文件总数
            total_files = 0
            for root_dir, dirs, files in os.walk(folder):
                total_files += len(files)
            self.progress_bar['maximum'] = total_files
            current_file = 0

            # 遍历主文件夹下的所有子文件夹
            for root_dir, dirs, files in os.walk(folder):
                for file in files:
                    file_path = os.path.join(root_dir, file)
                    # 处理文件重名问题
                    new_file_path = self.get_unique_filename(folder, file)
                    # 移动文件到主文件夹
                    shutil.move(file_path, new_file_path)
                    current_file += 1
                    self.progress_bar['value'] = current_file
                    self.root.update_idletasks()

            # 删除所有子文件夹
            for root_dir, dirs, files in os.walk(folder, topdown=False):
                for dir in dirs:
                    dir_path = os.path.join(root_dir, dir)
                    shutil.rmtree(dir_path)

            messagebox.showinfo("完成", "文件移动和文件夹删除操作已完成!")
            # 操作完成后启用查看文件按钮
            self.view_files_button['state'] = tk.NORMAL
        except PermissionError:
            messagebox.showerror("错误", "权限不足,无法移动文件或删除文件夹,请检查文件和文件夹权限。")
        except FileNotFoundError:
            messagebox.showerror("错误", "文件或文件夹未找到,请检查选择的文件夹路径是否正确。")
        except Exception as e:
            messagebox.showerror("错误", f"操作过程中出错: {str(e)}")

处理文件重名问题

get_unique_filename 方法用于处理文件重名问题,当目标文件夹中已经存在同名文件时,会在文件名后面添加序号,直到生成一个唯一的文件名。

    def get_unique_filename(self, target_folder, filename):
        """处理文件重名问题,添加序号"""
        base_name, ext = os.path.splitext(filename)
        counter = 1
        new_filename = filename
        while os.path.exists(os.path.join(target_folder, new_filename)):
            new_filename = f"{base_name}_{counter}{ext}"
            counter += 1
        return os.path.join(target_folder, new_filename)

打开文件夹

open_folder 方法用于在操作完成后打开处理后的文件夹,根据不同的操作系统(Windows、Linux 或 macOS)采用不同的方式打开文件夹,并处理可能出现的打开错误。

    def open_folder(self):
        folder = self.folder_path.get()
        if folder:
            try:
                if os.name == 'nt':  # Windows 系统
                    os.startfile(folder)
                elif os.name == 'posix':  # Linux 或 macOS 系统
                    webbrowser.open(folder)
            except Exception as e:
                messagebox.showerror("错误", f"打开文件夹时出错: {str(e)}")


if __name__ == "__main__":
    root = tk.Tk()
    app = FileMoverApp(root)
    root.mainloop()

二、功能介绍

  • 可视化操作:通过图形用户界面,用户可以方便地选择要处理的文件夹,无需手动输入路径。
  • 文件移动:将所选文件夹下所有子文件夹中的文件统一移动到主文件夹。
  • 重名处理:自动处理文件重名问题,避免文件覆盖。
    文件夹删除:在文件移动完成后,自动删除所有子文件夹。
  • 进度显示:使用进度条实时显示文件移动的进度。
  • 错误处理:对可能出现的权限错误、文件未找到错误等进行捕获和处理,并给出明确的错误提示。
  • 查看结果:操作完成后,可通过点击 “查看文件” 按钮打开处理后的文件夹。

三、 作者有话说

代码功能已经过严格测试,确认无误。然而,值得注意的是,测试集的大小仅为3个G,相对而言规模较小,因此无法百分之百保证在所有情况下均无任何问题。鉴于此,强烈建议在使用之前做好数据备份,以防万一出现数据丢失的情况。如果您在使用过程中发现任何bug或问题,欢迎随时留言反馈,作者将及时响应并进行相应的修改。

相关文章:

  • MySQL 查询缓存技术深度解析
  • container::erase
  • 推荐几款较好的开源成熟框架
  • Day4 25/2/17 MON
  • TCP/IP参考模型之区别(Differences Between the OSI and TCP/IP Reference Models)
  • C++Linux进阶项目分析-仿写Redis之Qedis
  • C++ list:链表的“乐高积木”与“灵活小火车”
  • vue3项目实践心得-多次渲染同一svg + 理解v-if、transition、dom加载之间的顺序
  • 面向企业的采购ERP管理系统
  • 【HF设计模式】07-适配器模式 外观模式
  • kong API Key 认证插件详解
  • java连接redis
  • Flutter 正在推进全新 PlatformView 实现 HCPP, 它又用到了 Android 上的什么黑科技
  • 微信小程序 - 网络请求基础路径集中管理(基础路径集中管理策略、动态切换基础路径)
  • 深入理解大语言模型的文本数据处理流程
  • python 并行请求多个 HTTP 接口
  • 设计模式在Qt中的应用
  • 深度集成DeepSeek大模型:WebSocket流式聊天实现
  • C#+SqlSugar实现主从库读写分离
  • 面向长范围交互式 LLM 智体的强化学习
  • 电子商务网站建设收益举例/资源搜索神器
  • 西宁市企业建站专业/网络营销手段
  • 网站做图尺寸大小/关键词优化seo多少钱一年
  • 珠海高端网站建设公司/国内免费域名注册网站
  • 企业网站的建立/网络营销的认识与理解
  • 网站关键词做排名不分/外链工具下载