一、开发环境搭建与依赖安装
本系统基于Python环境开发,无需购买昂贵的商业软件。首先需要配置Python运行环境及OCR识别引擎。请严格按照以下步骤执行,避免环境配置错误导致程序无法运行。
1. 安装Python环境
访问Python官网下载Windows安装包。下载地址:https://www.python.org/downloads/release/python-31011/。下载时务必勾选"Add Python to PATH"选项,这会将Python自动添加到系统环境变量中。安装完成后,在命令行输入python --version,若显示版本号则安装成功。
2. 安装Tesseract-OCR引擎
Tesseract是开源的OCR识别引擎,用于从图片中提取文字。下载Windows安装包,地址:https://github.com/UB-Mannheim/tesseract/wiki。请下载tesseract-ocr-w64-setup-5.3.0.20221207.exe版本。安装过程中,在"Choose Components"界面务必勾选"Additional language data(download)",并展开列表勾选Chinese (Simplified)和English语言包,否则无法识别中文档案。安装路径建议保持默认C:\Program Files\Tesseract-OCR,后续代码中会调用此路径。
3. 安装Python依赖库
打开命令行(CMD或PowerShell),依次执行以下三条命令安装所需库。如果下载速度慢,请使用国内镜像源。
```bash
pip install pytesseract
pip install Pillow
pip install openpyxl
```
二、项目目录结构规划
在本地D盘根目录下创建一个名为AutoArchive的文件夹作为项目根目录。为了实现自动化的“输入-处理-输出”流程,需在该文件夹下建立以下标准目录结构:
- D:\AutoArchive\input:存放待整理的杂乱档案图片(支持jpg, png, bmp格式)。
- D:\AutoArchive\output:存放整理后的文件,程序会自动在此处按日期分类。
- D:\AutoArchive\log:存放整理记录Excel表。
请手动创建上述三个文件夹。这种物理隔离的方式能防止源文件被覆盖,确保数据安全。
三、核心功能代码实现
本系统核心逻辑包含三个模块:OCR文字提取、智能重命名、Excel日志记录。以下是分步实现的详细代码逻辑,所有代码均整合在同一个脚本中。
1. 导入库与配置路径

代码首先引入必要的库,并硬编码Tesseract的安装路径。这是最容易报错的环节,请确保路径与实际安装位置一致。
```python
import os
import shutil
import datetime
import pytesseract
from PIL import Image
import openpyxl
from openpyxl.styles import Font
指定tesseract.exe的绝对路径,请根据实际安装情况修改
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
定义工作目录
BASE_DIR = r'D:\AutoArchive'
INPUT_DIR = os.path.join(BASE_DIR, 'input')
OUTPUT_DIR = os.path.join(BASE_DIR, 'output')
LOG_DIR = os.path.join(BASE_DIR, 'log')
```
2. OCR文字提取函数
该函数接收图片路径,返回识别出的文本。配置lang='chi_sim+eng'表示同时识别中文简体和英文。image_to_string方法会将图片像素转换为文本字符串。
```python
def extract_text_from_image(image_path):
try:
打开图片文件
img = Image.open(image_path)
使用OCR识别,指定中英文混合语言包
text = pytesseract.image_to_string(img, lang='chi_sim+eng')
return text.strip()
except Exception as e:
print(f"识别文件 {image_path} 失败: {e}")
return None
```
3. 文件整理与移动逻辑
这是主处理函数。它会遍历Input文件夹,提取图片中的前10个字符作为文件名,结合当前日期生成新文件名,并将文件移动到Output目录下以日期命名的子文件夹中。
```python
def process_files():
检查输入目录是否有文件
files = [f for f in os.listdir(INPUT_DIR) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))]
if not files:
print("Input文件夹为空或没有支持的图片文件。")
return
获取当前日期用于创建分类文件夹
today_str = datetime.datetime.now().strftime('%Y-%m-%d')
target_folder = os.path.join(OUTPUT_DIR, today_str)
if not os.path.exists(target_folder):
os.makedirs(target_folder)
准备Excel日志数据
log_data = [["原文件名", "新文件名", "识别内容摘要", "处理时间", "状态"]]
for filename in files:
source_path = os.path.join(INPUT_DIR, filename)
print(f"正在处理: {filename} ...")
提取文字
content = extract_text_from_image(source_path)
生成新文件名:取识别内容的前10位+时间戳,防止重名
if content:
valid_name = "".join([c for c in content[:10] if c.isalnum()])
else:
valid_name = "UNIDENTIFIED"
timestamp = datetime.datetime.now().strftime('%H%M%S')
ext = os.path.splitext(filename)[1]
new_filename = f"{valid_name}_{timestamp}{ext}"
target_path = os.path.join(target_folder, new_filename)
移动文件
try:
shutil.move(source_path, target_path)
status = "成功"
print(f"已移动并重命名为: {new_filename}")
except Exception as e:
status = f"失败: {e}"
print(status)
记录日志
log_data.append([
filename,
new_filename,
content[:20] + "..." if content else "无内容",
datetime.datetime.now().strftime('%H:%M:%S'),
status
])
return log_data, today_str
```
四、Excel自动记录功能开发
为了方便人工复核,系统会自动生成Excel报表。使用openpyxl库创建工作簿,设置表头加粗样式,并将处理结果写入文件。
```python
def save_log_to_excel(log_data, date_folder):
if not log_data:
return
file_name = f"archive_log_{date_folder}.xlsx"
file_path = os.path.join(LOG_DIR, file_name)
创建工作簿
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "整理记录"
写入数据
for row in log_data:
ws.append(row)
设置表头样式:加粗
for cell in ws[1]:
cell.font = Font(bold=True)
保存文件
wb.save(file_path)
print(f"日志已保存至: {file_path}")
```
五、完整可执行脚本整合
将上述所有代码块整合,并添加main入口。请将以下代码完整复制,保存为archive_bot.py,并存放在D:\AutoArchive目录下。
```python
import os
import shutil
import datetime
import pytesseract
from PIL import Image
import openpyxl
from openpyxl.styles import Font
配置区域
如果Tesseract不在默认路径,请修改此处
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
BASE_DIR = r'D:\AutoArchive'
INPUT_DIR = os.path.join(BASE_DIR, 'input')
OUTPUT_DIR = os.path.join(BASE_DIR, 'output')
LOG_DIR = os.path.join(BASE_DIR, 'log')
-
def extract_text_from_image(image_path):
try:
img = Image.open(image_path)
psm 6 假设图像为统一的文本块
config = r'--psm 6'
text = pytesseract.image_to_string(img, lang='chi_sim+eng', config=config)
return text.strip()
except Exception as e:
print(f"识别错误: {e}")
return None
def save_log_to_excel(log_data, date_folder):
if not log_data: return
file_name = f"archive_log_{date_folder}.xlsx"
file_path = os.path.join(LOG_DIR, file_name)
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "整理记录"
for row in log_data:
ws.append(row)
for cell in ws[1]:
cell.font = Font(bold=True)
wb.save(file_path)
print(f"日志已生成: {file_path}")
def main():
print("=== 档案自动整理系统启动 ===")
if not os.path.exists(INPUT_DIR):
print(f"错误:找不到输入目录 {INPUT_DIR},请检查目录结构。")
return
files = [f for f in os.listdir(INPUT_DIR) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))]
if not files:
print("Input文件夹中没有待处理的图片文件。")
return
today_str = datetime.datetime.now().strftime('%Y-%m-%d')
target_folder = os.path.join(OUTPUT_DIR, today_str)
if not os.path.exists(target_folder):
os.makedirs(target_folder)
log_data = [["原文件名", "新文件名", "识别摘要", "处理时间", "状态"]]
for filename in files:
source_path = os.path.join(INPUT_DIR, filename)
print(f"-> 正在处理: {filename}")
content = extract_text_from_image(source_path)
清理文件名中的非法字符
if content:
raw_name = content[:10].replace('\n', '').replace('\r', '').replace('/', '').replace('\\', '')
valid_name = "".join([c for c in raw_name if c.isalnum()])
else:
valid_name = "UNIDENTIFIED"
if not valid_name: valid_name = "NO_NAME"
timestamp = datetime.datetime.now().strftime('%H%M%S')
ext = os.path.splitext(filename)[1]
new_filename = f"{valid_name}_{timestamp}{ext}"
target_path = os.path.join(target_folder, new_filename)
try:
shutil.move(source_path, target_path)
status = "成功"
print(f" [OK] 归档为: {new_filename}")
except Exception as e:
status = str(e)
print(f" [ERR] 移动失败: {status}")
log_data.append([
filename,
new_filename,
(content[:15].replace('\n', '') + "...") if content else "无",
datetime.datetime.now().strftime('%H:%M:%S'),
status
])
save_log_to_excel(log_data, today_str)
print("=== 所有任务处理完毕 ===")
if __name__ == "__main__":
main()
```
六、系统运行与效果验证
代码部署完成后,按照以下步骤进行实操验证:
- 准备素材:找几张包含文字信息的图片(如合同扫描件、发票照片),文件名随意(例如:IMG_001.jpg, 123.png)。将这些文件全部复制到
D:\AutoArchive\input文件夹中。
- 执行脚本:打开命令行,切换到项目目录
cd D:\AutoArchive,输入命令python archive_bot.py并回车。
- 查看结果:
- Input文件夹应为空(文件已被移走)。
- Output文件夹下会出现一个以当前日期命名的文件夹(如2023-10-27),里面是重命名后的文件。
- Log文件夹下会生成Excel文件,打开可看到每张图片的原始名称、新名称及识别出的文字摘要。
如果遇到TesseractNotFoundError,请再次检查代码中tesseract_cmd的路径是否正确指向了.exe文件。如果识别出的中文是乱码,请确认安装时是否下载了chi_sim语言数据包。通过这套系统,无需人工逐一命名即可完成大量档案的初步归类,大幅降低人工整理成本。