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

上海网站建设300福州搜索优化网站

上海网站建设300,福州搜索优化网站,成都工业设计公司排名,零代码建站【Python】 打造高效文件分类工具 一、代码整体结构二、关键代码解析#xff08;一#xff09;初始化部分#xff08;二#xff09;界面创建部分#xff08;三#xff09;核心功能部分#xff08;四#xff09;其他辅助功能部分 三、运行与使用四、示图五、作者有话说 … 【Python】 打造高效文件分类工具 一、代码整体结构二、关键代码解析一初始化部分二界面创建部分三核心功能部分四其他辅助功能部分 三、运行与使用四、示图五、作者有话说 该代码基于 Python 的 tkinter 库实现了 “文件分类工具 - 优化版” 图形化桌面应用。用户能通过界面选择文件夹和要分类的文件类型支持全选或自定义部分文件扩展名进行分类。采用多线程技术执行文件整理任务避免界面卡顿且可中途停止。利用 os.scandir 高效遍历文件并批量分组处理对大文件超 500MB增加延迟处理并记录日志。通过消息队列记录整理过程包含跳过文件、移动文件及错误信息等支持将日志保存为文本文件。整理完成后显示总文件数、成功移动数、失败次数和跳过文件数等统计信息还可直接打开整理后的文件夹查看结果。 一、代码整体结构 我们的文件分类工具基于 Python 的 Tkinter 库构建Tkinter 是 Python 的标准 GUIGraphical User Interface图形用户界面库它提供了丰富的组件来创建交互式应用程序。整个代码围绕一个名为FileOrganizerApp的类展开这个类负责管理界面元素、用户交互以及文件整理的核心逻辑。 二、关键代码解析 一初始化部分 class FileOrganizerApp:def __init__(self, root):self.root rootself.root.title(文件分类工具-优化版)self.root.geometry(800x600)# 初始化统计变量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]# 创建消息队列self.log_queue queue.Queue()self.create_widgets()self.running Falseself.stop_event threading.Event() 在__init__ 方法中我们首先设置了应用程序窗口的标题和初始大小。接着初始化了一系列统计变量用于记录整理过程中的文件总数、成功移动的文件数、出错的文件数以及当前的进度。 为了让用户能够选择要分类的文件类型我们定义了all_files_var布尔变量用于全选功能checkbox_vars字典来存储每个文件扩展名对应的复选框状态checkboxes字典用于存储复选框组件preset_extensions列表则列出了我们预设支持分类的文件扩展名。 消息队列log_queue用于在不同线程间传递日志信息确保界面的流畅更新。最后调用create_widgets方法创建界面元素并初始化一些控制变量。 二界面创建部分 def create_widgets(self):# 文件夹选择部分frame_top ttk.Frame(self.root, padding10)frame_top.pack(filltk.X)self.btn_select ttk.Button(frame_top, text选择文件夹, commandself.select_directory)self.btn_select.pack(sidetk.LEFT, padx5)self.path_var tk.StringVar()self.entry_path ttk.Entry(frame_top, textvariableself.path_var, width60)self.entry_path.pack(sidetk.LEFT, padx5, filltk.X, expandTrue)# 文件类型选择部分type_frame ttk.LabelFrame(self.root, text选择要分类的文件类型, padding10)type_frame.pack(filltk.BOTH, expandTrue, pady5)# 全选复选框ttk.Checkbutton(type_frame,text全部分类,variableself.all_files_var,commandself.toggle_checkboxes).grid(row0, column0, stickytk.W, padx5)# 创建扩展名复选框for idx, ext in enumerate(self.preset_extensions):self.checkbox_vars[ext] tk.BooleanVar()cb ttk.Checkbutton(type_frame,textext.upper(),variableself.checkbox_vars[ext])cb.grid(rowidx // 5 1, columnidx % 5, stickytk.W, padx5)self.checkboxes[ext] cb# 控制按钮部分frame_controls ttk.Frame(self.root, padding10)frame_controls.pack(filltk.X)self.btn_start ttk.Button(frame_controls, text开始整理, commandself.start_organize)self.btn_start.pack(sidetk.LEFT, padx5)self.btn_stop ttk.Button(frame_controls, text停止, commandself.stop_organize, statetk.DISABLED)self.btn_stop.pack(sidetk.LEFT, padx5)# 保存日志按钮self.btn_save_log ttk.Button(frame_controls, text保存日志, commandself.save_log, statetk.DISABLED)self.btn_save_log.pack(sidetk.LEFT, padx5)# 查看文件按钮初始状态为禁用self.btn_view_files ttk.Button(frame_controls, text查看文件, commandself.open_folder, statetk.DISABLED)self.btn_view_files.pack(sidetk.LEFT, padx5)# 日志显示部分frame_log ttk.Frame(self.root, padding10)frame_log.pack(filltk.BOTH, expandTrue)self.log_area scrolledtext.ScrolledText(frame_log, wraptk.WORD)self.log_area.pack(filltk.BOTH, expandTrue)# 进度条self.progress ttk.Progressbar(self.root, orienttk.HORIZONTAL, modedeterminate)self.progress.pack(filltk.X, padx10, pady5)create_widgets方法负责构建应用程序的整个界面。它分为几个主要部分 文件夹选择部分包含一个按钮btn_select用于打开文件选择对话框以及一个输入框entry_path用于显示用户选择的文件夹路径。文件类型选择部分通过一个标签框架type_frame包含一个全选复选框和多个文件扩展名复选框。全选复选框的command参数绑定到toggle_checkboxes方法用于切换所有扩展名复选框的状态。控制按钮部分包括开始整理按钮btn_start、停止按钮btn_stop初始状态为禁用、保存日志按钮btn_save_log初始状态为禁用和查看文件按钮btn_view_files初始状态为禁用。这些按钮分别绑定到对应的功能方法。日志显示部分使用scrolledtext.ScrolledText组件创建一个可滚动的文本区域log_area用于显示文件整理过程中的日志信息。进度条部分通过ttk.Progressbar创建一个水平进度条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(targetself.organize_files, daemonTrue)worker.start()start_organize方法是启动文件整理流程的入口。首先它检查用户是否选择了要整理的文件夹路径如果没有则弹出警告框提示用户。然后检查当前是否已经在运行整理任务如果是则直接返回。 接着设置运行状态变量running为True清除停止事件stop_event并根据任务状态更新界面按钮的状态清空进度条和日志区域。 为了确保日志能够及时更新调用process_log_queue方法启动日志队列处理同时调用update_progress方法开始更新进度条。最后创建一个新的线程来执行核心的文件整理逻辑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_extensionif 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_okTrue)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系统错误: {str(e)})self.root.after(10, self.organize_complete)organize_files方法是文件分类的核心逻辑所在。它首先获取用户选择的目标文件夹路径target_dir。然后使用os.scandir函数更高效地遍历目标文件夹中的所有文件将文件列表存储在files变量中并记录文件总数total_files。 接下来根据用户在界面上选择的文件类型进行分组处理。如果用户选择了全部分类all_files_var为True则selected_exts为None表示处理所有文件否则通过列表推导式获取用户勾选的文件扩展名集合selected_exts。 使用defaultdict创建file_groups字典将文件按扩展名分组。在遍历文件过程中如果文件类型不在用户选择的范围内则跳过该文件并记录跳过的文件数。 在批量移动文件阶段首先计算需要处理的文件总数total_to_process。对于每个文件组创建对应的目标文件夹如果不存在然后逐个移动文件。在移动文件时增加了对大文件超过 500MB的处理逻辑当遇到大文件时在日志中记录并增加 0.5 秒的延迟以避免在处理大文件时导致系统卡顿。同时每成功移动 50 个文件在日志中记录已移动的文件数。如果移动过程中出现错误记录错误信息并增加错误计数。 在整个过程中根据已处理文件数和总文件数实时更新当前进度current_progress。最后通过root.after方法在 10 毫秒后调用organize_complete方法用于处理整理完成后的后续操作。 四其他辅助功能部分 def stop_organize(self):self.stop_event.set()self.log_queue.put(正在停止整理进程...)stop_organize方法用于停止文件整理任务。它通过设置stop_event事件通知正在执行文件整理的线程停止操作并在日志队列中添加停止进程的提示信息。 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方法负责从日志队列log_queue中获取日志信息并将其显示在日志区域log_area中。它通过一个循环不断尝试从队列中获取消息使用get_nowait方法避免阻塞。如果队列为空捕获queue.Empty异常并跳过。每次获取并显示消息后通过root.after方法设置 100 毫秒后再次调用自身以实现实时更新日志。 def update_progress(self):self.progress[value] self.current_progressself.root.after(100, self.update_progress)update_progress方法用于更新进度条的显示。它将当前进度current_progress的值设置到进度条progress上并通过root.after方法设置 100 毫秒后再次调用自身以实现进度条的实时更新。 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整理完成\nf总文件数: {self.total_files}\nf成功移动: {self.moved_count}\nf失败次数: {self.error_count}\nf跳过文件: {self.total_files - self.moved_count - self.error_count})self.log_queue.put(stats_message)messagebox.showinfo(整理统计, stats_message)organize_complete方法在文件整理完成后被调用。它首先将运行状态变量running设置为False并恢复界面按钮的初始状态启用开始按钮、禁用停止按钮、启用保存日志按钮和查看文件按钮。同时将进度条设置为 100%。 然后生成整理统计信息字符串stats_message包含总文件数、成功移动的文件数、失败次数和跳过的文件数。将统计信息添加到日志队列中并通过messagebox.showinfo弹出对话框显示整理统计结果。 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, encodingutf-8) as f:f.write(log_text)messagebox.showinfo(保存成功, 日志已成功保存。)except Exception as e:messagebox.showerror(保存失败, f保存日志时出现错误{str(e)})save_log方法用于将日志区域中的内容保存为文本文件。它首先获取日志区域的所有文本内容log_text然后通过filedialog.asksaveasfilename打开文件保存对话框让用户选择保存路径和文件名。如果用户选择了保存路径尝试将日志内容写入文件。如果保存成功弹出提示框告知用户如果保存过程中出现错误捕获异常并弹出错误提示框。 def open_folder(self):folder self.path_var.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)})open_folder方法用于在文件整理完成后打开用户选择的目标文件夹。它 首先获取用户在界面上选择的文件夹路径folder。如果路径存在根据当前操作系统类型进行不同的操作对于 Windows 系统使用os.startfile函数打开文件夹对于 Linux 或 macOS 系统使用webbrowser.open函数打开文件夹。如果在打开过程中出现异常捕获异常并通过messagebox.showerror弹出错误提示框告知用户打开文件夹时出现的错误信息。 三、运行与使用 当你运行这段代码时会弹出一个图形化界面的文件分类工具窗口。在窗口中你可以通过点击 “选择文件夹” 按钮选择需要整理文件的文件夹路径该路径会显示在输入框中。 在 “选择要分类的文件类型” 区域你可以选择 “全部分类”也可以单独勾选需要分类的文件扩展名类型如 “TXT”“JPG”“PDF” 等。完成选择后点击 “开始整理” 按钮工具将开始扫描文件夹内的文件并按照你选择的类型进行分类整理。 在整理过程中进度条会实时显示整理进度日志区域会记录整理过程中的详细信息包括每个文件的处理情况、错误信息等。如果在整理过程中你想停止操作可以点击 “停止” 按钮。整理完成后你可以点击 “保存日志” 按钮将整理过程中的日志信息保存为文本文件也可以点击 “查看文件” 按钮直接打开整理后的文件夹查看分类结果。 四、示图 五、作者有话说 代码功能已经过严格测试确认无误。然而值得注意的是测试集的大小仅为3个G相对而言规模较小因此无法百分之百保证在所有情况下均无任何问题。鉴于此强烈建议在使用之前做好数据备份以防万一出现数据丢失的情况。如果您在使用过程中发现任何bug或问题欢迎随时留言反馈作者将及时响应并进行相应的修改。
http://www.w-s-a.com/news/930791/

相关文章:

  • 能打开各种网站的浏览器推荐建设部的网站首页
  • 苏州高端网站建设开发wordpress 删除图片
  • saas网站开发外贸网站设计风格
  • c 手机网站开发湘阴网页定制
  • 阿里云虚拟主机搭建wordpressWordPress优化手机端
  • 湖北长安建设网站衡阳市做网站
  • 灯饰网站建设图片深圳做网站哪家公司好
  • 网站的构造有什么网站做生鲜配送的
  • 怎么在手机上做微电影网站小马厂网站建设
  • 网络广告投放网站中山网
  • 保定网站制作专业网页设计模板html代码运行
  • 中国专利申请网官网杭州seo优化
  • 杭州低价做网站网站系统功能流程图
  • 档案室建设网站名贵中药材初加工平台
  • 怎么做优惠券的网站wordpress加载速度
  • 手机网站 分辨率如何创建网站挣钱
  • 网站建设工作标准做模版网站
  • 免费注册微信网站怎样做天猫网站视频
  • 青海建设厅网站通知wordpress如何改文章id
  • 国外搜索网站建设支付网站备案
  • 合肥建站公司有哪家招聘的拼车平台网站开发
  • 网站 备案 固话北京建站模板企业
  • 网站开发的公司wordpress分类目录 模版
  • flashfxp怎么上传对应网站空间wordpress无法创建
  • 建设网站案例分析做网站代理怎么赚钱
  • 唯品会网站建设特色域名备案期间 网站访问
  • 郑东新区建设局网站怎么做万网网站
  • 阿里云上传的网站 服务器路径试用网站开发
  • 做美食原创视频网站网站开发要多钱
  • 怎么做网站作业哪个网站可兼职做logo