背景介绍
在日常办公或学习中,我们常常会遇到大量文件,尤其是从不同来源下载的文件,其命名往往不规范,缺乏描述性。这不仅影响查找效率,也增加了文件管理的复杂度。为了解决这一问题,我们可以开发一个文件内容提取与重命名工具,该工具能够扫描指定文件夹中的文件,提取其中的关键信息(如文本、图片中的文字、PDF标题等),并根据提取内容智能重命名文件,从而提升文件管理的智能化水平。
本项目适合中级以下的 Python 开发者,涵盖以下核心技术点:
– 文件遍历与读取
– 多线程处理
– 文本提取与 OCR 识别
– PDF 内容提取
– GUI 界面设计(使用 Tkinter)
– 第三方库集成(PyPDF2、Pillow、pytesseract)
思路分析
- 用户交互:使用 Tkinter 创建 GUI 界面,允许用户选择文件夹,并启动重命名流程。
- 文件扫描:遍历用户选择的文件夹,识别支持的文件类型(.txt、.jpg、.png、.pdf)。
- 内容提取:
.txt文件:直接读取文本内容。.jpg/.png图片:使用 OCR(Tesseract)提取图片中的文字。.pdf文件:使用 PyPDF2 提取 PDF 的标题页内容。
- 智能重命名:根据提取的关键信息生成新的文件名,并重命名文件。
- 多线程处理:为提高效率,使用
concurrent.futures.ThreadPoolExecutor并行处理多个文件。 - 错误处理与日志:确保程序健壮性,记录处理日志。
代码实现
1. 安装依赖库
请先安装以下 Python 第三方库:
pip install PyPDF2 pillow pytesseract
注意:使用 OCR 功能需要安装 Tesseract OCR 引擎,并将其添加到系统环境变量中。Tesseract 官网
2. 完整实现代码(Python)
import os
import re
import threading
import tkinter as tk
from tkinter import filedialog, messagebox
from concurrent.futures import ThreadPoolExecutor
from PIL import Image
import pytesseract
import PyPDF2
# 设置 Tesseract OCR 的路径(根据你的安装路径修改)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
# 支持的文件类型及其处理函数
SUPPORTED_TYPES = {
'.txt': lambda path: extract_text_from_txt(path),
'.pdf': lambda path: extract_title_from_pdf(path),
'.jpg': lambda path: extract_text_from_image(path),
'.png': lambda path: extract_text_from_image(path),
}
def extract_text_from_txt(file_path):
"""从 .txt 文件中提取文本内容"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
return f.read().strip()
except Exception as e:
return f"无法读取 {file_path}: {e}"
def extract_title_from_pdf(file_path):
"""从 PDF 文件中提取第一页的文本作为标题"""
try:
with open(file_path, 'rb') as f:
reader = PyPDF2.PdfReader(f)
if len(reader.pages) == 0:
return "PDF 为空"
first_page = reader.pages[0]
text = first_page.extract_text().strip()
# 提取标题(假设标题为前几行)
lines = text.split('\n')
title = lines[0] if lines else "无标题"
return title[:50] # 限制标题长度
except Exception as e:
return f"无法读取 {file_path}: {e}"
def extract_text_from_image(file_path):
"""使用 OCR 提取图片中的文字"""
try:
with Image.open(file_path) as img:
return pytesseract.image_to_string(img, lang='chi_sim+eng').strip()
except Exception as e:
return f"无法识别 {file_path}: {e}"
def sanitize_filename(name):
"""清理文件名,避免非法字符"""
name = re.sub(r'[\\/:*?"<>|]', '', name) # 移除非法字符
name = name.strip() # 去除首尾空格
return name[:100] # 限制长度
def rename_file(file_path, new_name):
"""重命名文件"""
dir_path, old_name = os.path.split(file_path)
ext = os.path.splitext(old_name)[1]
new_file_name = f"{new_name}{ext}"
new_file_path = os.path.join(dir_path, new_file_name)
try:
os.rename(file_path, new_file_path)
return f"成功重命名: {old_name} → {new_file_name}"
except Exception as e:
return f"重命名失败: {old_name} - {e}"
def process_files(folder_path):
"""处理文件夹中的所有文件"""
results = []
with ThreadPoolExecutor(max_workers=4) as executor:
futures = []
for root, _, files in os.walk(folder_path):
for file in files:
file_path = os.path.join(root, file)
ext = os.path.splitext(file_path)[1].lower()
if ext in SUPPORTED_TYPES:
func = SUPPORTED_TYPES[ext]
futures.append(executor.submit(func, file_path))
for future in futures:
content = future.result()
if "无法" in content:
results.append(f"跳过: {content}")
else:
new_name = sanitize_filename(content)
result = rename_file(file_path, new_name)
results.append(result)
return results
def select_folder():
"""弹出文件夹选择对话框"""
folder_path = filedialog.askdirectory()
if folder_path:
status_label.config(text="正在处理文件...")
threading.Thread(target=process_folder, args=(folder_path,), daemon=True).start()
def process_folder(folder_path):
"""启动文件处理线程"""
results = process_files(folder_path)
status_label.config(text="处理完成!")
messagebox.showinfo("完成", f"共处理 {len(results)} 个文件。\n点击确定查看详细日志。")
print("\n".join(results))
# GUI 界面
root = tk.Tk()
root.title("文件内容提取与重命名工具")
root.geometry("500x200")
tk.Label(root, text="选择文件夹以开始智能重命名:").pack(pady=10)
select_button = tk.Button(root, text="选择文件夹", command=select_folder)
select_button.pack(pady=10)
status_label = tk.Label(root, text="", fg="blue")
status_label.pack(pady=10)
root.mainloop()
3. 示例运行说明
- 运行程序:运行上述代码,会弹出一个简单的 GUI 界面。
- 选择文件夹:点击“选择文件夹”按钮,选择包含
.txt,.jpg,.png,.pdf文件的目录。 - 自动处理:程序将自动提取每个文件的关键信息,并重命名文件。
- 查看结果:处理完成后,会弹出提示窗口,并在控制台打印处理日志。
4. 输出示例
输入文件夹 C:\Documents\Reports,包含以下文件:
report1.txt内容为:2025年度财务报告invoice.jpg图片文字为:Invoice No. 20250415summary.pdf第一页标题为:项目总结:AI技术应用
处理后文件名变为:
2025年度财务报告.txtInvoice No. 20250415.jpg项目总结:AI技术应用.pdf
总结
本项目实现了一个基于 Python 的“文件内容提取与重命名工具”,通过集成 OCR、PDF 提取和多线程处理,实现了对多种文件类型的智能重命名功能。该工具不仅具备实用价值,还能帮助开发者掌握以下技能:
- Tkinter GUI 设计
- 文件操作与遍历
- 多线程并发处理
- 第三方库(OCR、PDF)的使用
- 异常处理与日志记录
对于希望提升文件处理能力或学习 Python 图形界面开发的中级开发者来说,该项目是一个非常有价值的学习实践。你可以在此基础上进一步扩展功能,如支持更多文件格式、添加自定义命名规则、集成文件搜索等。