三门峡档案整理实战:Python自动化OCR与归档全流程解析

一、开发环境搭建与依赖库安装

在进行三门峡档案整理的数字化操作前,必须先配置好Python运行环境。本方案基于Python 3.9版本开发,利用PaddleOCR进行高精度中文识别,结合Pandas进行数据汇总。请严格按照以下步骤执行环境初始化,避免版本冲突。

1. 安装Python 3.9

访问Python官网下载Windows installer或使用Linux包管理器安装。确保安装时勾选"Add Python to PATH"。安装完成后,在终端输入以下命令验证版本:

```bash python --version ```

2. 安装核心依赖库

为了实现图片转文字、文件重命名及Excel导出,需要安装以下库。直接复制以下命令到终端执行:

```bash pip install paddlepaddle paddleocr pandas openpyxl pillow shutil ```

注意:如果你的系统没有GPU,PaddlePaddle会自动降级使用CPU运行,速度会稍慢,但对于档案整理这种IO密集型任务影响不大。如果安装速度过慢,建议使用国内清华源镜像:

```bash pip install -i https://pypi.tuna.tsinghua.edu.cn/simple paddlepaddle paddleocr pandas openpyxl pillow ```

二、档案目录结构标准化设计

在编写脚本前,必须在本地建立标准化的目录结构。假设你的项目文件夹位于D:\Sanmenxia_Archives,请手动创建以下子目录。这种结构能确保原始数据不被覆盖,且处理结果清晰可查。

  • raw_files/:存放待处理的扫描件图片或PDF(支持jpg, png格式)。
  • processed_files/:存放重命名并归类后的档案文件。
  • logs/:存放处理过程中产生的错误日志。
  • output/:存放最终导出的档案索引Excel表。

raw_files中,我们假设文件名是无规律的,例如IMG_20230101_001.jpg。我们的目标是通过OCR识别出文件中的“年份”、“编号”和“标题”,将其重命名为2023-年度报告-001.jpg并移动到processed_files

三、OCR识别核心代码实现

三门峡档案整理实战:Python自动化OCR与归档全流程解析

PaddleOCR是目前中文识别准确率最高的开源库之一,且免费使用。我们将封装一个函数,专门用于提取图片中的文字信息。

新建文件archive_automation.py,首先导入必要的库并初始化OCR模型:

```python import os import shutil import re import pandas as pd from paddleocr import PaddleOCR from PIL import Image 初始化OCR模型,use_angle_cls=True自动旋转文字,lang='ch'表示中英文混合 ocr = PaddleOCR(use_angle_cls=True, lang='ch', show_log=False) def extract_text_from_image(image_path): """ 输入图片路径,返回识别出的所有文字拼接字符串 """ if not os.path.exists(image_path): return None try: 执行OCR识别 result = ocr.ocr(image_path, cls=True) 提取文字内容 text_list = [] if result and result[0]: for line in result[0]: text_list.append(line[1][0]) return "\n".join(text_list) except Exception as e: print(f"识别文件 {image_path} 失败: {e}") return None ```

四、档案元数据提取与清洗逻辑

识别出的文字是杂乱的,我们需要通过正则表达式提取关键信息。针对三门峡档案整理的常见格式,假设档案抬头包含“2023年”、“第001号”等特征。我们需要编写清洗逻辑,将非结构化文本转化为结构化数据。

```python def parse_archive_info(raw_text): """ 根据识别出的文本,提取年份、文号、标题 返回字典:{'year': '', 'doc_no': '', 'title': ''} """ info = { 'year': '未知年份', 'doc_no': '未知编号', 'title': '无标题' } if not raw_text: return info 1. 提取年份 (匹配 2023 或 2023年) year_pattern = re.compile(r'(20\d{2})') year_match = year_pattern.search(raw_text) if year_match: info['year'] = year_match.group(1) 2. 提取文号 (匹配 三档发〔2023〕1号 或类似格式) 这里根据实际档案格式调整正则,以下为通用示例 doc_pattern = re.compile(r'第(\d{1,4})号|No\.\s(\d+)') doc_match = doc_pattern.search(raw_text) if doc_match: 取第一个捕获组,如果为空取第二个 info['doc_no'] = doc_match.group(1) if doc_match.group(1) else doc_match.group(2) 3. 提取标题 (通常在文号或年份之后,取第一行较长的文字作为标题) lines = raw_text.split('\n') for line in lines: 过滤掉过短的行和纯符号行 clean_line = line.strip() if len(clean_line) > 5 and '关于' in clean_line: info['title'] = clean_line[:20] 截取前20字作为文件名,避免过长 break return info ```

实操细节:正则表达式r'(20\d{2})'用于匹配2000-2099年份。如果你的档案年份是90年代格式(如98年),请修改为r'(\d{2})年'并自行处理世纪逻辑。标题提取逻辑中使用了“关于”作为关键词,这是政府或企业公文的常见特征词,可根据实际情况修改。

五、自动化归档与重命名逻辑

这是脚本的主循环部分,负责遍历文件夹、调用识别、解析数据、重命名文件并移动到目标目录。此步骤必须包含异常捕获,防止因一张图片损坏导致整个程序中断。

```python def process_archives(raw_dir, processed_dir): 存储所有档案信息用于导出Excel archive_data = [] 支持的图片格式 valid_extensions = ['.jpg', '.jpeg', '.png', '.bmp'] files = os.listdir(raw_dir) total_files = len(files) print(f"开始处理,共发现 {total_files} 个文件。") for index, filename in enumerate(files): file_ext = os.path.splitext(filename)[1].lower() if file_ext not in valid_extensions: continue src_path = os.path.join(raw_dir, filename) print(f"[{index+1}/{total_files}] 正在处理: {filename}") 1. OCR识别 raw_text = extract_text_from_image(src_path) 2. 信息解析 info = parse_archive_info(raw_text) 3. 构造新文件名 格式:年份-文号-标题.后缀 safe_title = re.sub(r'[\\/?:"<>|]', '', info['title']) 去除文件名非法字符 new_filename = f"{info['year']}-{info['doc_no']}-{safe_title}{file_ext}" dst_path = os.path.join(processed_dir, new_filename) 4. 移动与重命名 try: 如果目标文件已存在,添加随机后缀避免覆盖 if os.path.exists(dst_path): new_filename = f"{info['year']}-{info['doc_no']}-{safe_title}_{os.urandom(4).hex()}{file_ext}" dst_path = os.path.join(processed_dir, new_filename) shutil.move(src_path, dst_path) print(f" -> 归档成功: {new_filename}") 记录数据 archive_data.append({ '原文件名': filename, '新文件名': new_filename, '年份': info['year'], '文号': info['doc_no'], '识别标题': info['title'], '归档状态': '成功' }) except Exception as e: print(f" -> 归档失败: {str(e)}") archive_data.append({ '原文件名': filename, '新文件名': '', '年份': '', '文号': '', '识别标题': '', '归档状态': f'失败: {str(e)}' }) return archive_data ```

六、数据汇总与Excel导出

整理完成后,我们需要生成一份Excel索引表,方便后续查阅。使用Pandas库可以轻松实现这一步。

```python def export_to_excel(data, output_path): if not data: print("没有数据可导出。") return df = pd.DataFrame(data) 调整列顺序,方便查看 columns_order = ['年份', '文号', '识别标题', '新文件名', '原文件名', '归档状态'] df = df[columns_order] 导出到Excel df.to_excel(output_path, index=False, engine='openpyxl') print(f"\n索引表已生成: {output_path}") ```

七、完整执行入口

将以上所有代码块整合到archive_automation.py文件中,并添加以下主执行代码。这是启动程序的唯一入口。

```python if __name__ == "__main__": 配置路径:请根据实际情况修改为你的绝对路径 BASE_DIR = r"D:\Sanmenxia_Archives" RAW_DIR = os.path.join(BASE_DIR, "raw_files") PROCESSED_DIR = os.path.join(BASE_DIR, "processed_files") OUTPUT_EXCEL = os.path.join(BASE_DIR, "output", "archive_index.xlsx") 确保输出目录存在 os.makedirs(PROCESSED_DIR, exist_ok=True) os.makedirs(os.path.dirname(OUTPUT_EXCEL), exist_ok=True) 开始执行 print("="50) print("三门峡档案自动化整理程序启动") print("="50) final_data = process_archives(RAW_DIR, PROCESSED_DIR) export_to_excel(final_data, OUTPUT_EXCEL) print("="50) print("所有任务执行完毕。") print("="50) ```

运行说明:

  1. 确保D:\Sanmenxia_Archives\raw_files文件夹中有待处理的图片。
  2. 在终端运行python archive_automation.py
  3. 程序运行完毕后,检查processed_files文件夹查看归档后的文件,检查output文件夹查看Excel索引表。

这套方案完全基于开源技术栈,无需购买任何商业软件即可实现三门峡档案整理的数字化与自动化。通过调整parse_archive_info函数中的正则表达式,可以适配不同格式的档案文件,实现真正的零门槛落地。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统