【Python】实现文件移动与文件夹删除工具
【Python】 实现文件移动与文件夹删除工具
- 一、代码整体结构
- 界面创建
- 选择文件夹
- 移动并删除操作
- 处理文件重名问题
- 打开文件夹
- 二、功能介绍
- 三、 作者有话说
在日常的文件管理工作中,我们常常需要将某个文件夹下子文件夹中的文件统一移动到主文件夹,并删除这些子文件夹。 手动操作不仅繁琐,还容易出错。Python 结合 Tkinter 库可以帮助我们开发一个可视化的工具来高效完成这些任务。下面将详细介绍这个文件移动与文件夹删除工具的实现过程。
一、代码整体结构
代码围绕 FileMoverApp 类展开,该类负责创建图形用户界面(GUI)和处理文件移动与文件夹删除的核心逻辑。在初始化部分,设置了窗口的标题和大小,初始化了用于存储文件夹路径的变量,并调用 create_widgets 方法创建界面组件。
import os
import shutil
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import webbrowserclass FileMoverApp:def __init__(self, root):self.root = rootself.root.title("文件移动与文件夹删除工具")self.root.geometry("400x300")# 初始化变量self.folder_path = tk.StringVar()# 创建界面self.create_widgets()
界面创建
create_widgets 方法负责创建 GUI 界面,主要包含以下几个部分:
- 选择文件夹部分: 提供一个文本框用于显示所选文件夹的路径,以及一个 “浏览” 按钮,点击该按钮可打开文件夹选择对话框。
- 执行按钮: “开始移动并删除” 按钮,点击后将触发文件移动和文件夹删除操作。
- 查看文件按钮: 初始状态为禁用,在操作完成后启用,点击可打开处理后的文件夹。
- 进度条: 用于显示文件移动的进度。
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("警告", "请先选择文件夹")returntry:# 统计文件总数total_files = 0for root_dir, dirs, files in os.walk(folder):total_files += len(files)self.progress_bar['maximum'] = total_filescurrent_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 += 1self.progress_bar['value'] = current_fileself.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.NORMALexcept 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 = 1new_filename = filenamewhile os.path.exists(os.path.join(target_folder, new_filename)):new_filename = f"{base_name}_{counter}{ext}"counter += 1return 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或问题,欢迎随时留言反馈,作者将及时响应并进行相应的修改。
相关文章:
【Python】实现文件移动与文件夹删除工具
【Python】 实现文件移动与文件夹删除工具 一、代码整体结构界面创建选择文件夹移动并删除操作处理文件重名问题打开文件夹 二、功能介绍三、 作者有话说 在日常的文件管理工作中,我们常常需要将某个文件夹下子文件夹中的文件统一移动到主文件夹,并删除这…...
LeetCode-680. 验证回文串 II
1、题目描述: 给你一个字符串 s,最多 可以从中删除一个字符。 请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false 。 示例 1: 输入:s "aba" 输出&a…...
【故障处理】- 执行命令crsctl query crs xxx一直hang
【故障处理】- 执行命令crsctl query crs xxx一直hang 一、概述二、故障处理三、解决方法 一、概述 Oracle RAC环境中,遇到执行crsctl query crs xxx等相关命令不返回任何结果,一直hang在那里。系统下执行命令ps -ef |grep crsctl query crs softwarever…...
JMeter工具介绍、元件和组件的介绍
Jmeter功能概要 JDK常用文件目录介绍 Bin目录:存放可执行文件和配置文件 Docs目录:是Jmeter的API文档,用于开发扩展组件 printable_docs目录:用户帮助手册 lib目录:存放JMeter依赖的jar包和用户扩展所依赖的Jar包…...
【Python 语法】Python 正则表达式(regular expressions, regex)
1. 基本语法1.1 字符匹配1.2 元字符1.3 特殊字符1.4 分组和捕获1.5 断言2. 常用函数2.1 `re.match()`2.2 `re.search()`2.3 `re.findall()`2.4 `re.sub()`2.5 `re.split()`3. 进阶用法3.1 捕获组3.2 非捕获组3.3 预查Python 中的**正则表达式(regular expressions, regex)**是…...
在 Python 里,None 可能是调用者主动传入的值,所以不能用 None 来判断参数是否被提供。
在 Python 里,None 可能是调用者主动传入的值,所以不能用 None 来判断参数是否被提供。 使用 object() 生成一个特殊的 唯一标记变量,用作默认参数的占位符,就可以明确区分调用者是否真的传递了这个参数。 📌 为什么 …...
DeepSeek 引领AI 大模型时代,服务器产业如何破局进化?
2025 年 1 月,DeepSeek - R1 以逼近 OpenAI o1 的性能表现,在业界引起轰动。其采用的混合专家架构(MoE)与 FP8 低精度训练技术,将单次训练成本大幅压缩至 557 万美元,比行业平均水平降低 80%。这一成果不仅…...
安卓burp抓包,bypass ssl pinning
好久好久没有发东西了。主要是懒。。。 这几天在搞apk渗透,遇到了burp无法抓包问题,觉得可以写下来。 问题描述 1. 一台安卓手机,装了面具,可以拿到root 2. 电脑上有burp,设置代理 3.手机和电脑连同一个网段&…...
服务器中部署大模型DeepSeek-R1 | 本地部署DeepSeek-R1大模型 | deepseek-r1部署详细教程
0. 部署前的准备 首先我们需要足够算力的机器,这里我在vultr中租了有一张A16显卡一共16GB显存的服务器作为演示。部署的模型参数为14b的。如果需要部署满血版本671b的,需要更大的算力支持,这里由于是个人资金有限,就演示14b的部署…...
rust学习笔记2-rust的包管理工具Cargo使用
首先先解决一个配置文件,目前rust版本升级后,config已经改成 config.toml 内容也做了如下调整 [source.crates-io] replace-with tuna[source.tuna] registry "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git" 1.Rust 编程…...
DDD - 可能会用到的分布式事务
一、分布式事务的概念: 分布式事务是指跨越多个独立的资源或服务(例如多个数据库、微服务、消息队列等)执行的事务操作,其目标是确保整个事务在多个系统中保持原子性和一致性,即要么所有操作全部成功提交,…...
DeepSeek + Vue实战开发
利用DeepSeek V3模型、siliconflow大模型一站式云服务平台以及vue3.0实现一个在线人工智能客服对话系统。 因为deepseek官网的api密钥使用起来比较缓慢,所以可以使用第三方的,具体操作请自行查阅资料。 siliconflow官网 SiliconFlow, Accelerate AGI …...
【数据结构】(8) 二叉树
一、树形结构 1、什么是树形结构 根节点没有前驱,其它节点只有一个前驱(双亲/父结点)。所有节点可以有 0 ~ 多个后继,即分支(孩子结点)。每个结点作为子树的根节点,这些子树互不相交。 2、关于…...
拉链表介绍
拉链表(Slowly Changing Dimension, Type 2) 是一种在数据仓库中用于跟踪维度数据历史变化的存储技术。它通过记录数据的生命周期(开始时间和结束时间)来保留历史状态,同时避免全量存储冗余数据。以下是详细解释及实际…...
Web 后端 请求与响应
一 请求响应 1. 请求(Request) 客户端向服务器发送的HTTP请求,通常包含以下内容: 请求行:HTTP方法(GET/POST等)、请求的URL、协议版本。 请求头(Headers):…...
CEF132 编译指南 Linux 篇 - CEF 编译实战:构建 CEF(六)
1. 引言 经过前几篇的精心准备,我们已经完成了所有必要的环境配置和源码下载。现在,我们将进入激动人心的 CEF 编译阶段。本篇将详细指导你在 Linux 系统上编译 CEF 6834 分支(对应 Chromium 132 版本),包括创建项目文…...
奥比中光3D机器视觉相机能连接halcon吗?
奥比中光的设备与Halcon的兼容性可以通过以下方式实现: 数据接口的通用性 奥比中光的相机(如Astro Pro、大白等)支持通过UVC协议获取彩色图像,深度数据则通过OpenNI或ROS2接口传输105。若Halcon支持这些协议或标准接口(如ROS消息、OpenCV图像流),则可通过直接调用或二次…...
【Spring+MyBatis】_图书管理系统(上篇)
目录 1. MyBatis与MySQL配置 1.1 创建数据库及数据表 1.2 配置MyBatis与数据库 1.2.1 增加MyBatis与MySQL相关依赖 1.2.2 配置application.yml文件 1.3 增加数据表对应实体类 2. 功能1:用户登录 2.1 约定前后端交互接口 2.2 后端接口 2.3 前端页面 2.4 单…...
【苍穹外卖】学习
软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责, 并了解软件开发中涉及到的三种软件环境。那么这一小节,我们将从 软件开发流程、角色…...
DeepSeek-V2-技术文档
DeekSeek-v2-简述 1. DeepSeek-V2是什么? DeepSeek-V2是一个基于混合专家(Mixture-of-Experts,简称MoE)架构的语言模型。它是一种新型的人工智能模型,专门用于处理自然语言处理(NLP)任务,比如文本生成、翻译、问答等。与传统的语言模型相比,DeepSeek-V2在训练成本和…...
VictoriaLogs Syslog日志收集存储系统部署
Docker部署 启动命令 使用以下命令通过Docker启动VictoriaLogs容器: docker run -d --restart always \-p 9428:9428 \-p 514:514/udp \-v ./victoria-logs-data:/victoria-logs-data \--name victoria-logs-syslog-songxwn.com \docker.io/victoriametrics/victor…...
使用 Apache PDFBox 提取 PDF 中的文本和图像
在许多应用中,我们需要从 PDF 文件中提取文本内容和嵌入的图像。为了实现这一目标,Apache PDFBox 是一个非常实用的开源工具库。它提供了丰富的 API,可以帮助我们轻松地读取 PDF 文件、提取其中的文本、图像以及其他资源。 本文将介绍如何使…...
Linux中线程创建,线程退出,线程接合
线程的简单了解 之前我们了解过 task_struct 是用于描述进程的核心数据结构。它包含了一个进程的所有重要信息,并且在进程的生命周期内保持更新。我们想要获取进程相关信息往往从这里得到。 在Linux中,线程的实现方式与进程类似,每个线程都…...
Groovy语言的学习路线
Groovy语言的学习路线 引言 在当前的编程世界中,随着多种编程语言的涌现,开发者常常需要选择合适的语言来满足项目的需求。Groovy语言作为一种动态语言,在Java虚拟机(JVM)环境中得到了广泛使用。它具有简单易用的语法…...
nlf 3d pose 部署学习笔记
目录 multi_hmr创建SemanticRenderer 推理代码 渲染代码: 调用原版render,没成功 用的pose和smlx生成vertices,也有vertices3d hmr2,用的是网络生成的vertices进行渲染。 nlf地址: GitHub - isarandi/nlf: [NeurIPS 2024] Neural Localizer Fields for Continuous …...
【vmware虚拟机安装教程】
以下是在VMware Workstation Pro上安装虚拟机的详细教程: 准备工作 下载VMware Workstation Pro 访问VMware官网下载并安装VMware Workstation Pro(支持Windows和Linux系统)。安装完成后,确保已激活软件(试用版或正式…...
window中git bash使用conda命令
window系统的终端cmd和linux不一样,运行不了.sh文件,为了在window中模仿linux,可以使用gui bash模拟linux的终端。为了在gui bash中使用python环境,由于python环境是在anaconda中创建的,所以需要在gui bash使用conda命…...
PHP语法完全入门指南:从零开始掌握动态网页
本文专为零基础新手设计,通过5000字详细讲解带你系统学习PHP语法。包含环境搭建、基础语法、实战案例,并附20+代码示例。阅读后你将能独立开发简单动态网页! 一、PHP开发环境搭建(新手必看) 1.1 为什么需要搭建环境? PHP是服务器端脚本语言,需要运行在服务器环境中。推…...
什么是蒸馏技术
蒸馏技术(Knowledge Distillation, KD)是一种模型压缩和知识迁移的方法,旨在将一个复杂模型(通常称为“教师模型”)的知识转移到一个小型模型(通常称为“学生模型”)中。蒸馏技术的核心思想是通…...
Python——寻找矩阵的【鞍点】(教师:恒风)
在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点 恒风的编程 思路: 使用while循环找到行中最大值,此时列的坐标已知,利用列表推导式生成列不变的纵列,利用min()函数得到纵…...
