查看: 168|回复: 3

Python批量重命名PDF文件:基于正则提取中间数字与自定义前后缀

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在日常文档管理中,经常需要对大量PDF文件进行规范化命名。例如将“36266郜一凡200304000038内部调拨.pdf”改为“1234一二200304000038保留规则.pdf”,即保留文件名中的特定数字段,同时统一替换前缀和后缀。本文提供一个完整的Python脚本,借助os、re和tkinter库实现批量重命名,并附带简易图形界面,方便非技术用户直接使用。

### 功能概述

程序运行后,用户输入目标文件夹路径,点击“开始重命名”按钮,程序会自动遍历该目录下所有.pdf后缀的文件。它会用正则表达式提取文件名中符合“数字+任意字符+数字”模式的第二组数字,然后将其与新前缀、新后缀拼接成新文件名,最后执行重命名操作。如果文件夹路径无效或重命名过程中出现错误,程序会弹出相应的提示框。

### 核心代码实现

以下为完整的Python代码,可直接保存为.py文件运行。代码依赖Python标准库(os、re、tkinter),无需额外安装。
  1. import os
  2. import re
  3. import tkinter as tk
  4. from tkinter import messagebox
  5. def rename_pdf_files(folder_path, new_prefix, new_suffix):
  6.     for filename in os.listdir(folder_path):
  7.         if filename.endswith('.pdf'):
  8.             match = re.search(r'(\d+).*?(\d+)', filename)
  9.             if match:
  10.                 middle_part = match.group(2)
  11.                 new_filename = f"{new_prefix}{middle_part}{new_suffix}.pdf"
  12.                 old_file_path = os.path.join(folder_path, filename)
  13.                 new_file_path = os.path.join(folder_path, new_filename)
  14.                 try:
  15.                     os.rename(old_file_path, new_file_path)
  16.                     print(f"已将 {filename} 重命名为 {new_filename}")
  17.                 except Exception as e:
  18.                     print(f"重命名 {filename} 时出错: {e}")
  19. def start_renaming():
  20.     folder_path = entry.get()
  21.     if not os.path.exists(folder_path):
  22.         messagebox.showerror("错误", f"你输入的路径 {folder_path} 不存在,请检查后重新输入。")
  23.         return
  24.     new_prefix = '1234一二'
  25.     new_suffix = '保留规则'
  26.     rename_pdf_files(folder_path, new_prefix, new_suffix)
  27.     messagebox.showinfo("完成", "文件重命名操作已完成。")
  28. root = tk.Tk()
  29. root.title("PDF 文件重命名")
  30. root.geometry("400x400")
  31. label = tk.Label(root, text="请输入文件所在路径:")
  32. label.pack(pady=20)
  33. entry = tk.Entry(root, width=50)
  34. entry.pack(pady=10)
  35. button = tk.Button(root, text="开始重命名", command=start_renaming)
  36. button.pack(pady=20)
  37. root.mainloop()
复制代码

### 关键函数解析

**rename_pdf_files** 是重命名的核心函数,接收三个参数:目标目录、新前缀、新后缀。

- 遍历文件:通过os.listdir获取文件夹内所有条目,再使用filename.endswith('.pdf')筛选出PDF文件。
- 提取中间部分:正则表达式r'(\d+).*?(\d+)'会捕获两组连续数字,其中第一组对应原文件名中第一个数字串(如“36266”),第二组对应第二个数字串(如“200304000038”)。由于目标是要保留第二个数字串,故取match.group(2)。
- 构建新文件名:用f-string将前缀、中间部分、后缀拼接,注意后缀变量不包含扩展名,所以后面加上“.pdf”。
- 重命名文件:os.rename完成实际操作。若因权限或文件已存在等原因失败,会捕获异常并打印错误信息。

**start_renaming** 是按钮绑定函数,负责获取输入框内容、验证路径是否存在、设定预设的前后缀、调用批量重命名函数,最后弹出完成提示。

### 图形界面设计

利用tkinter构建了一个简单的窗口:

- 创建主窗口并设置标题和尺寸。
- 添加Label提示用户输入目录路径。
- Entry组件供用户手动输入或粘贴路径。
- 按钮绑定start_renaming函数。
- 启动主事件循环(root.mainloop())。

### 使用说明

1. 将上述代码保存为“rename_pdf.py”。
2. 在命令行运行 python rename_pdf.py。
3. 在弹出的窗口中输入待处理文件夹的完整路径(例如“D:\PDFs”)。
4. 点击“开始重命名”按钮,等待程序执行完毕。
5. 控制台会逐条输出重命名结果,若遇到错误会打印详细信息。

### 注意事项与扩展

- 正则表达式匹配规则:当前仅提取第二个连续数字串。若原始文件名不符合“数字+任意字符+数字”的模式,文件将不会被重命名。可根据实际需求修改正则表达式。
- 前缀和后缀在代码中硬编码为“1234一二”和“保留规则”,可修改为动态输入或通过配置文件读取。
- 由于程序直接修改文件名,建议先在小范围测试,或备份原文件。
- 若需处理子目录中的PDF,可改用os.walk或递归调用。

本脚本适合需要对PDF文件名进行统一格式化整理的场景,例如批量处理从系统导出的带有杂乱人名的文书,或者为电子档案添加统一标识。通过调整正则和前后缀,可以轻松适配更多命名规则。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python批量重命名PDF文件:基于正则提取中间数字与自定义前后缀

感谢分享,这个脚本非常实用,正好解决了我日常整理PDF文件的痛点。我想问一下,如果文件名中数字段数量不固定(比如有时三个数字段,有时两个),我想保留最后一段数字,正则表达式应该怎么调整?另外,前缀和后缀目前是硬编码的,如果改成在界面上让用户自定义输入,是不是更灵活?期待你的进一步优化建议。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python批量重命名PDF文件:基于正则提取中间数字与自定义前后缀

感谢分享,这个脚本非常实用!正则提取中间数字那段设计得很巧妙,图形界面也降低了使用门槛,对不熟悉命令行的用户很友好。如果能把前后缀也做成输入框就更灵活了,不过对固定需求来说这样也足够了。学习了,点赞!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python批量重命名PDF文件:基于正则提取中间数字与自定义前后缀

感谢分享这个实用的脚本!正则提取中间数字的方式很巧妙,配合tkinter的图形界面让非技术用户也能轻松使用。有个小建议:可以在界面上增加输入前后缀的文本框,避免硬编码,这样会更灵活。另外,对于重名冲突的情况,也许可以增加一个确认或自动添加序号的功能。再次感谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-2 13:04 , Processed in 0.026730 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部