使用 PyQt 和 Python 制作批量文件重命名工具

2025年3月17日 | 阅读16分钟

当您想要在重命名文件夹中的多个文件时使用特定的命名模式时,手动操作可能既耗时又容易出错。如果您正考虑使用 Python 创建自定义的批量文件重命名解决方案来自动化文件重命名过程,那么本教程正是为您准备的。

完成本课程中的项目后,您将能够运用各种 PyQt 和 Qt Designer 技能。

引言

在本文中,您将构建一个批量文件重命名工具,以自动化重命名文件系统中特定目录下的多个文件的过程。您将使用 PyQt 开发程序的图形用户界面(GUI),并利用 Python 的 pathlib 来管理文件重命名操作。

如果您完成本课程,您的批量文档重命名工具将具有以下外观和功能。

当您完成应用程序的构建后,您将能够重命名文件系统中的多个文件,这是整理文件夹和文件时的常规操作。尽管本示例的应用程序专注于 Python 文件和图像,但您也可以添加其他文件类型。

项目概述

在本教程中,您将创建的项目是一个 GUI 程序,它可以从指定目录加载多个文件,并允许您使用定义的名称前缀和连续数字重命名所有这些文件。此外,您还将学习如何组织该项目。

前提条件

要完成本教程并从中获得最大收益,您应该熟悉以下概念:

使用 Python 和 PyQt 构建 GUI 应用程序。使用 Qt Designer 创建 GUI。使用 PyQt QThread 分流耗时的进程,防止 GUI 冻结。

您的批量文件重命名工具依赖于外部软件 PyQt v5.15.12。您可以像往常一样使用 pip 从 PyPI 安装这个库。

根据 Python 的最佳实践建议,您应该创建一个虚拟环境来隔离项目的依赖项。之后,就可以开始开发您的批量文件重命名应用程序了!

步骤 1:为批量重命名文件工具创建 GUI。

在本节中,您将学习如何使用 Qt Designer 轻松开发批量文件重命名工具的 GUI。

此外,您还将学习如何立即将您的 .ui 文件转换为 Python 代码。

使用 Qt Designer 创建 GUI

启动 Qt Designer 来为您的批量文件重命名程序开发 GUI。然后在基于小部件的表单上执行示例中的步骤。

  1. 将标签的文本设置为“上次源目录:”。
  2. 添加一个行编辑框以容纳目录的路径,并将其 readOnly 属性更改为 True。
  3. 将按钮的文本设置为“加载文件(&L)”。
  4. 将两个标签的字体样式设置为粗体,并分别添加文字“要重命名的文件”和“已重命名的文件”。
  5. 添加两个列表小部件,用于显示要重命名的文件和已重命名的文件。
  6. 将标签和它们对应的列表小部件进行垂直布局。
  7. 使用分隔条将两个布局连接在一起。
  8. 将标签的文本设置为“文件名前缀:”。
  9. 添加一个行编辑框,其占位符文本为“将文件重命名为...”,以接收用户的文件名前缀。
  10. 将标签的文本设置为 .jpg。
  11. 将按钮的文本设置为“重命名(&R)”。
  12. 将进度条的值设置为零。
  13. 如果您希望标签、行编辑框和按钮在调整大小时表现一致,可以更改它们的最小和最大尺寸。
  14. 选择网格作为表单的顶级布局。

由于您将在 Python 代码中使用对象名称,因此应将其更改为更易读和更具描述性的名称。点击 Qt Designer 工具栏上的“保存”,将修改后的对象名称永久保存在您的 Window.ui 文件中。此外,您也可以通过按键盘快捷键 Ctrl+S 来保存文件。

一旦您完成了批量文件重命名程序的界面创建,就可以关闭 Qt Designer,因为您不再需要它了。您将在下一节中执行该任务。

将 Qt Designer 的输出转换为 Python 源代码

当您有了一个适合您应用程序且格式为 .ui 的 GUI 文件后,您必须将 .ui 文件的内容转换为 Python 代码,以便在最终的应用程序中加载 GUI。这个转换可以使用 PyQt 提供的 pyuic5 命令行工具来完成。

通过查看 Window.ui 文件的内容,您可以看到它包含 XML 代码。该代码定义了应用程序 GUI 的所有图形元素。下面显示了文件内容的一部分:

Window.ui 文件用于创建一个名为 window.py 的 Python 模块,然后将其存储在 rprename/ui/ 目录中。您的批量文件重命名工具的 GUI 在 Python 中的编码位于该模块中。以下是代码的简短摘录:

Ui_Window_var 提供了批量文件重命名工具图形用户界面的完整源代码。而 .retranslateUi() 则

至此,您的项目布局已完成。您已拥有制作批量文件重命名工具所需的一切。现在是时候使用您刚刚创建的图形用户界面(GUI)来组装基本的 PyQt 应用程序了。

步骤 2:创建 PyQt 骨架应用程序。到目前为止,您已经使用 Qt Designer 为批量文件重命名工具创建了一个图形用户界面。此外,为了在应用程序中使用 .ui 文件的内容,您利用 pyuic5 将其自动转换为 Python 代码。最后,您将代码保存到 rprename/ui/ 目录下的 window.py 文件中。

构建一个 PyQt 骨架应用程序并配置其主窗口以使用 window.py GUI 代码。

设置批量文件重命名工具的窗口

在开始为您的批量文件重命名工具构建骨架 PyQt 应用程序之前,您必须首先创建应用程序的主窗口。首先在您喜欢的代码编辑器或 IDE 中打开 rprename/ init .py 文件。包含以下信息:

除了几条注释和模块文档字符串外,上述文件还定义了一个名为 __version__ 的顶层常量,用于包含应用程序的版本号。

之后,打开 rprename/views.py 并在其中输入以下信息:

您必须首先将 QWidget_var 包 PyQt5.QtWidgets 导入 views.py。然后从 ui.Window 导入 Ui_Window。如您所见,这个类提供了批量文件重命名工具的 GUI。

之后,您创建了一个名为 Window 的类。这个类使用了多重继承。它不仅派生自您的 GUI 类 Ui_Window,还派生自 QWidget_var。QWidget_var 提供了基本的 GUI 功能,而 Ui_Window 则为该程序提供了您需要的专门 GUI 配置。

Window 的初始化函数使用 super 来调用基类的初始化函数 ()。此外,它还调用 .setupUI(),这是一个非公开方法,它收集了创建和配置 GUI 所需的所有代码。到目前为止,setupUI(self_var) 只是调用了来自第二个父类 Ui_Window 的 .setupUi()。

现在,您可以使用 Window 的初始版本为您的批量文件重命名工具开发一个 PyQt 骨架程序。

应用程序的 PyQt 骨架构建

现在应用程序的主窗口已准备就绪,是时候编写构建 PyQt 应用程序所需的样板代码了。再次在您的代码编辑器中打开 rprename/apps.py 文件。然后整合以下代码。

要在此模块中访问 exit(),您必须导入 sys。当用户关闭主窗口时,您可以使用此函数安全地退出应用程序。之后,您从 views 导入 Window,从 PyQt5 导入 QApplication。最后一步是将 main() 定义为应用程序的主要功能。

Window 和 QApplication 在 main() 中创建。然后您使用 Window.show()。最后,您使用 .exec() 来执行应用程序的主循环或事件循环。

太棒了!您的批量文件重命名工具的图形用户界面(GUI)有一个按钮,用于加载您想要重命名的文件。顶部的行编辑框将显示源目录的路径。左侧的列表小部件将显示要重命名的文件列表,右侧的列表小部件将显示已重命名的文件。

用户需要输入文件名前缀,然后点击“重命名”才能开始重命名文件的过程。底部的进度条将显示文件重命名的进度。

在下一节中,您将同时重命名多个文件,并编写必要的代码以提供应用程序的主要功能。

步骤 3:pathlib 和 PyQt 线程重命名

您将利用 PyQt 的 QThread 和 Python 的 pathlib 来为您的批量文件重命名工具实现文件重命名功能。您可以使用 pathlib 重命名文件和管理文件系统上的路径。另一方面,使用 QThread 重命名文件将在一个单独的执行线程中进行。为什么?

然而,重命名过程可能会花费很长时间,这取决于您想要重命名的文件数量。当一个长时间运行的任务在应用程序的主线程中启动时,它可能会冻结图形用户界面,这会损害用户体验。

您可以通过创建一个工作线程 QThread 来分流文件重命名过程,并避免 GUI 冻结问题,从而使您的应用程序保持响应。

再次点击下面的链接,下载您将在本节中编写的所有代码。

在开始重命名文件之前,您必须首先有一种将文件加载到应用程序中的方法。在选择要重命名的文件后,您必须将这些文件的路径存储在一个方便的数据结构中。

返回到 rprename/views.py 并按如下方式修改代码:

在这种情况下,首先从 collections 模块导入 deque。Deque 适用于栈和队列。一个 deque 将用于存储您需要重命名的文件的路径。

您也可以从 pathlib 导入 PathPath。这个类可以表示您文件系统上实际文件或目录的路径。这个类将用于对文件和目录进行各种操作。在本教程中,您将学习如何使用 PathPath.rename() 来重命名硬盘驱动器上的物理文件。

您现在可以通过单击“加载文件”将多个文件加载到您的批量文件重命名工具中。请注意,“选择要重命名的文件”对话框允许您从各种文件过滤器中进行选择,以指定要加载到应用程序中的文件类型。

注意:上面代码以及本教程其余代码示例中的行号旨在方便解释。它们不遵循脚本或模块的最终行顺序。

太棒了!您已经可以将各种文件类型加载到您的项目中。请关闭应用程序以继续编码。您将在下一节中使用文件重命名功能。

在工作线程 QThread 中重命名多个文件

您可以通过设置一个工作线程来将重命名文件的任务从应用程序的主线程中委托出去。通过这样做,当您选择多个文件进行重命名时,可以避免任何潜在的 GUI 冻结问题。

将使用一个 QThread 对象来执行文件重命名操作。

工作线程将使用 Pathlib.rename 来重命名文件。立即在您的代码编辑器中打开 rprename/rename.py 文件。输入即将出现的代码:

这段代码的作用如下:

第 9 行导入了 PyQt5.QtCore 的 QObject 和 pyqtSignal()。您可以使用 QObject 创建具有自定义信号和功能的子类。您可以使用 pyqtSignal() 创建自定义信号,并在特定事件发生时发出它们。第 11 行定义了 Renamer,一个 QObject 的子类。第 13 到 15 行定义了三个自定义信号。

  • 每当类重命名一个新文件时,都会调用 .progressed() 函数。这个数字将用于更新应用程序图形用户界面中的进度条。
  • 每次类重命名一个文件时,都会调用 .renamedFile() 函数。在这种情况下,信号提供了重命名后文件的路径。该路径将更新应用程序图形用户界面中已重命名文件的列表。
  • 当文件重命名过程完成时,将调用函数 .finished()。

第 17 行的类初始化函数需要两个参数:

  • 存储所选文件列表的是 `files`。每个文件的表示是其对应的 `PathPath`。
  • 用于重命名文件的文件名前缀在 `prefixes` 中。

然后定义了用于重命名文件的 .renameFiles_var() 方法。

  • 第 24 行使用文件名前缀 fileNumber_var 和文件扩展名 .suffix 来创建新的文件名。然后,通过将新文件名与父目录的路径连接起来,创建当前文件的路径 newFile_var。
  • 在第 27 行,通过调用带有参数 newFile_var 的 .rename() 来重命名当前文件。
    • 第 29 行和第 30 行发送了 .progressed() 和 .renamedFile() 信号。
    • 在第 31 行,发出带有参数 0 的 .progressed() 函数。
    • 当文件重命名过程完成时,第 32 行会发出 .finished() 信号。

在您编写完 Renamer 之后,您现在已经准备好开始重命名文件了。在您执行此操作之前,需要创建并设置一个工作线程。但是,在执行此操作之前,请返回 rprename/views.py 并按如下方式修改其导入部分:

此步骤的第一步是将“重命名”按钮的 .renameFiles_var() 方法链接到 .clicked() 方法。要设置、配置和运行工作线程,此方法调用 runRenamerThread_var()。代码的最后一行定义了 updateStateWhenFileRenamed_var()。该方法在重命名文件时,会从待重命名文件列表中移除该文件。然后,该方法会更新应用程序图形用户界面(GUI)中待重命名和已重命名文件的列表。

步骤 4:根据重命名进度更改 GUI 状态。到目前为止,您的批量文件重命名工具已经提供了大部分功能。该工具已经允许您在文件系统中重命名多个文件。但是,如果用户在文件重命名过程中途点击“重命名”,会发生什么情况?此外,如果用户没有提供文件名前缀,又会发生什么?

另一个更明显的问题是,应用程序的进度条没有显示文件重命名的进度。

所有这些问题都涉及到根据应用程序的当前状态来调整用户界面。在本节中,您将编写必要的代码来解决或预防上述问题。您将首先处理进度条。

更新进度条

在 GUI 程序中,进度条通常用于让用户了解耗时任务的进展情况。如果用户没有收到有关程序当前性能的反馈,他们可能会认为程序被阻塞、卡住或遇到内部问题。

在这个项目中,你使用一个进度条来提供关于文件重命名过程在任何时刻的进展情况的反馈。回到我们的代码编辑器中的 rprename/views.py 文件,并做如下更改来实现这一点:

现在完成了!如果您愿意,可以再次运行您的应用程序。它将按如下方式运行:

通过对 Window 的这些更改,您的批量文件重命名工具的进度条现在可以准确显示文件重命名过程的状态,这很好,并增强了用户体验。

启用和禁用 GUI 组件

在开发图形用户界面(GUI)应用程序时,您会意识到某些 GUI 操作仅在特定情况下可用。例如,如果用户没有提供文件名前缀,或者应用程序中没有加载任何文件,那么允许他们点击“重命名”按钮就没有意义。

在这种情况下,至少有两种方法可以采取:

  1. 始终保持所有小部件启用,并确保它们不会执行在上下文中没有意义的操作。
  2. 小部件可以根据应用程序的状态启用或禁用。

可以使用条件语句来确保特定操作在特定时间有意义,以实现第一种方法。另一方面,要实现第二种策略,您需要识别您的应用程序可能遇到的所有状态,并提供根据这些状态更新用户界面的方法。

您将使用相同的方法来更新 GUI,因为上表中第一个和最后一个状态非常相似。这意味着您只需要使用四种方法。

返回 views.py 并在 Window 中添加以下代码以开始编写这些方法。

此更新的工作原理如下:

  • 在 setupUI() 内部,第 8 行调用 ._updateStateWhenNoFiles()。当您启动应用程序时,这将更新用户界面,而 _updateStateWhenNoFiles() 在第 10 行定义。
  • 文件总数在第 11 行更新。在这种状态下,Len(self_var._files) 返回 0。
  • “加载文件”按钮在第 12 行被启用以接受用户事件。
  • “加载文件”按钮在第 13 行成为主要焦点。用户可以通过按键盘上的空格键将文件加载到应用程序中。
  • “重命名”按钮在第 14 行被禁用。该按钮不响应并呈灰色显示。
  • “文件名前缀”行编辑框在第 15 行被移除。这会消除之前提供的任何前缀。
  • 第 16 行禁用了“文件名前缀”行编辑框。如果应用程序中没有文件,用户就无法在此处输入文件名前缀。
  • Renamer 实例的 .finished() 信号和 ._updateStateWhenNoFiles() 在第 22 行连接。当文件重命名过程完成时,这将更新 GUI。

当应用程序启动时,您可以启动对话框并通过按键盘上的空格键选择要重命名的文件。您无法对“重命名”按钮和“文件名前缀”行编辑框执行操作。

现在您可以编写代码,以便在文件加载到应用程序时更新用户界面。

当用户点击“重命名”时,应用程序会启动文件重命名过程,并调用“updateStateWhileRenaming()”来相应地更新 GUI。该方法可以防止用户在重命名过程中点击“加载文件”和“重命名”按钮。

就是这样!如果您现在运行该应用程序,将会出现以下行为。

您的批量文件重命名工具的 GUI 现在可以在任何给定时间显示应用程序的当前状态。因此,您可以为您的客户提供用户友好且无压力的体验。为您的努力喝彩!

输出截图

Bulk File Rename Tool with PyQt and Python

结论

在整理文件和文件夹时,一个常见的问题是多个文件被自动重命名。在本教程中,您构建了一个真实世界的 GUI 应用程序,以快速有效地完成此任务。通过构建此工具,您展示了与 PyQt 和 Qt Designer 应用程序开发相关的广泛能力。您还使用了 Python 的 pathlib 来处理文件。

您收到了关于如何操作的说明:

  • 使用 PyQt 线程来分流批量文件重命名过程
  • 使用 pathlib 管理系统路径和重命名文件
  • 根据文件重命名过程更新 GUI 状态
  • 使用 Qt Designer 构建批量文件重命名工具的 GUI