Python实现孤儿院档案自动化整理与归档实操指南

一、开发环境准备与依赖库安装

在开始整理孤儿院档案之前,我们需要构建一个基于Python的自动化处理环境。请确保你的操作系统已安装Python 3.8及以上版本。如果尚未安装,请直接访问Python官网下载安装包并运行安装程序,安装时务必勾选"Add Python to PATH"选项。

打开终端(Windows下为CMD或PowerShell,Mac/Linux下为Terminal),执行以下命令安装本次实操所需的核心依赖库。这些库分别用于数据处理、Excel读写、图像处理及OCR文字识别。

```bash pip install pandas openpyxl pillow pytesseract ```

由于涉及到纸质档案的数字化OCR识别,你还需要在系统中安装Tesseract-OCR引擎。

  • Windows用户:访问 https://github.com/UB-Mannheim/tesseract/wiki 下载最新的安装包(推荐tesseract-ocr-w64-setup-5.x.x.exe)。安装时请务必勾选所有语言包,特别是中文简体数据包,并记住安装路径(默认为 C:\Program Files\Tesseract-OCR)。
  • Mac用户:执行命令 brew install tesseract tesseract-lang
  • Linux用户:执行命令 sudo apt install tesseract-ocr tesseract-ocr-chi-sim

二、档案基础数据清洗与标准化

假设我们手头有一份名为 orphanage_raw.xlsx 的Excel表格,其中包含了儿童的姓名、入院日期、身份证号等关键信息,但数据格式不统一。我们需要编写脚本将其清洗为标准格式。

请在项目目录下新建 data_clean.py 文件,并复制以下代码。该脚本会自动填充缺失的入院日期,统一身份证号的大小写,并生成唯一的档案ID。

```python import pandas as pd from datetime import datetime def clean_orphanage_data(input_file, output_file): 读取Excel文件 try: df = pd.read_excel(input_file) except FileNotFoundError: print(f"错误:找不到文件 {input_file}") return 1. 填充缺失的入院日期,默认设为系统当天 df['入院日期'] = pd.to_datetime(df['入院日期'], errors='coerce').fillna(datetime.now()) 2. 标准化身份证号(去除空格并转大写) if '身份证号' in df.columns: df['身份证号'] = df['身份证号'].astype(str).str.upper().str.strip() 3. 生成标准档案ID:OR_年份_序号 (例如: OR_2023_001) df['档案ID'] = 'OR_' + df['入院日期'].dt.year.astype(str) + '_' + \ df.index.astype(str).str.zfill(3) 4. 删除完全为空的行 df.dropna(how='all', inplace=True) 保存清洗后的数据 df.to_excel(output_file, index=False) print(f"数据清洗完成,已保存至 {output_file}") print(df.head()) 打印前5行预览 if __name__ == "__main__": clean_orphanage_data('orphanage_raw.xlsx', 'orphanage_cleaned.xlsx') ```

在终端执行 python data_clean.py。运行后,目录下会生成 orphanage_cleaned.xlsx,其中包含格式统一的数据和生成的档案ID,这是后续文件归档的核心依据。

三、杂乱档案文件的批量重命名

通常孤儿院的档案文件夹中充斥着“扫描1.jpg”、“新建文件夹 (2).pdf”等无意义的文件名。我们需要利用清洗后的Excel数据,将这些文件根据档案ID姓名进行批量重命名。

新建 rename_files.py,确保你的图片和PDF文件存放在项目目录下的 raw_files 文件夹中。

```python import os import pandas as pd import shutil def batch_rename_files(excel_path, source_dir, target_dir): 创建归档目录 if not os.path.exists(target_dir): os.makedirs(target_dir) 读取清洗后的数据 df = pd.read_excel(excel_path) 建立姓名映射到档案ID的字典 (假设姓名是唯一的,实际操作建议用身份证号匹配) 这里为了演示方便,建立一个 {姓名: 档案ID} 的映射 id_map = dict(zip(df['姓名'], df['档案ID'])) files = os.listdir(source_dir) for filename in files: file_path = os.path.join(source_dir, filename) if os.path.isfile(file_path): 简单的匹配逻辑:如果文件名中包含某个人的名字 matched_name = None for name in os.listdir(source_dir): 仅为演示逻辑,实际需遍历id_map pass 修正逻辑:遍历映射表查找文件名中包含的关键词 for name, archive_id in id_map.items(): if name in filename: matched_name = name target_id = archive_id break if matched_name: 获取文件扩展名 ext = os.path.splitext(filename)[1] 新文件名:档案ID_姓名.后缀 new_filename = f"{target_id}_{matched_name}{ext}" new_file_path = os.path.join(target_dir, new_filename) 移动并重命名文件 shutil.move(file_path, new_file_path) print(f"已处理: {filename} -> {new_filename}") else: print(f"未匹配到数据,跳过: {filename}") if __name__ == "__main__": 注意:请确保当前目录下有 raw_files 文件夹和 orphanage_cleaned.xlsx batch_rename_files('orphanage_cleaned.xlsx', 'raw_files', 'processed_files') ```

Python实现孤儿院档案自动化整理与归档实操指南

执行此脚本后,所有能匹配到姓名的文件都会被移动到 processed_files 文件夹,并重命名为类似 OR_2023_001_张三.jpg 的标准格式。对于无法匹配的文件,脚本会提示跳过,需人工介入检查。

四、纸质档案OCR数字化提取

对于已经重命名的图片文件(如体检报告、入学申请表),我们往往需要提取其中的文字信息存入数据库。以下代码将遍历处理后的图片文件夹,使用Tesseract提取中文文本。

新建 ocr_extract.py。注意:Windows用户需在代码中显式指定Tesseract的路径。

```python import pytesseract from PIL import Image import os import pandas as pd import csv Windows系统必须指定tesseract.exe的路径,Mac/Linux通常不需要 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' def extract_text_from_images(image_dir, output_csv): results = [] 支持的图片格式 valid_extensions = ('.jpg', '.jpeg', '.png', '.bmp') files = [f for f in os.listdir(image_dir) if f.lower().endswith(valid_extensions)] print(f"开始处理 {len(files)} 个图片文件...") for filename in files: file_path = os.path.join(image_dir, filename) try: 打开图片 img = Image.open(file_path) 使用OCR提取文字,lang='chi_sim'指定为简体中文 config='--psm 6' 假设图片为统一的文本块 text = pytesseract.image_to_string(img, lang='chi_sim+eng', config='--psm 6') 简单清洗提取出的文本(去除首尾空格) clean_text = text.strip() 提取档案ID(从文件名解析) file_id = filename.split('_')[0] if '_' in filename else "Unknown" results.append({ '档案ID': file_id, '源文件名': filename, '提取内容': clean_text }) print(f"成功提取: {filename}") except Exception as e: print(f"处理 {filename} 失败: {e}") 将结果保存到CSV if results: df = pd.DataFrame(results) df.to_csv(output_csv, index=False, encoding='utf-8-sig') print(f"OCR提取完成,结果已保存至 {output_csv}") else: print("未提取到任何有效数据。") if __name__ == "__main__": extract_text_from_images('processed_files', 'ocr_results.csv') ```

运行 python ocr_extract.py。程序会逐个识别图片中的文字,并将识别结果连同对应的档案ID一起写入 ocr_results.csv。你可以打开CSV文件查看提取的准确性,如有偏差,可针对特定版面调整Tesseract的参数。

五、自动化目录归档与索引建立

最后一步是将所有整理好的文件按照年份和类别存放到层级目录中,建立一个易于检索的文件系统。我们将根据档案ID中的年份自动创建文件夹。

新建 archive_system.py

```python import os import shutil import pandas as pd def build_archive_system(excel_path, source_dir, base_archive_dir): 读取数据以获取更多元数据 df = pd.read_excel(excel_path) 创建一个字典,方便通过档案ID查找入院年份 假设档案ID格式为 OR_年份_序号 我们可以直接从ID截取年份,也可以从Excel的'入院日期'列获取精确年份 if not os.path.exists(base_archive_dir): os.makedirs(base_archive_dir) files = os.listdir(source_dir) for filename in files: file_path = os.path.join(source_dir, filename) if not os.path.isfile(file_path): continue 解析档案ID parts = filename.split('_') if len(parts) < 2: continue archive_id = parts[0] + '_' + parts[1] 获取 OR_2023 从ID中提取年份 (ID格式: OR_2023_001) year = filename.split('_')[1] 构建目标目录结构:Archive/2023/档案文件 target_year_dir = os.path.join(base_archive_dir, year) if not os.path.exists(target_year_dir): os.makedirs(target_year_dir) target_file_path = os.path.join(target_year_dir, filename) 复制文件到归档目录 try: shutil.copy2(file_path, target_file_path) print(f"归档完成: {filename} -> {target_year_dir}") except Exception as e: print(f"归档失败 {filename}: {e}") 生成一个简单的索引文件 index_file = os.path.join(base_archive_dir, 'archive_index.txt') with open(index_file, 'w', encoding='utf-8') as f: f.write("孤儿院档案归档索引\n") f.write("==================\n") for year_dir in os.listdir(base_archive_dir): if os.path.isdir(os.path.join(base_archive_dir, year_dir)): f.write(f"年份: {year_dir}\n") file_list = os.listdir(os.path.join(base_archive_dir, year_dir)) for file in file_list: f.write(f" - {file}\n") print(f"索引文件已生成: {index_file}") if __name__ == "__main__": build_archive_system('orphanage_cleaned.xlsx', 'processed_files', 'Final_Archive') ```

执行 python archive_system.py。此时,你的项目目录下会出现一个 Final_Archive 文件夹。打开它,你会看到所有文件已经按照年份自动分门别类存放,并且文件夹内包含一个 archive_index.txt 索引文件,方便快速查阅所有档案的物理存储位置。

六、常见报错处理与排查

在实操过程中,你可能会遇到以下具体问题,请按对应方案解决:

  • 报错:FileNotFoundError: [WinError 2] "tesseract" not found
    这是因为系统未找到Tesseract程序。请检查第二步中的安装是否成功,并在 ocr_extract.py 中取消注释 pytesseract.pytesseract.tesseract_cmd 这一行,确保路径指向你电脑上的 tesseract.exe 绝对路径。
  • 报错:PermissionError: [Errno 13] Permission denied
    这通常发生在文件正在被其他程序(如Excel、图片查看器)打开时。请关闭所有Excel文件和图片预览,然后重新运行脚本。
  • OCR识别结果为空或乱码
    如果图片分辨率过低或背景杂乱,OCR效果会很差。建议在OCR处理前,使用Pillow库对图片进行灰度化和二值化处理。可以在 Image.open() 后添加:
    img = img.convert('L') 转灰度
    img = img.point(lambda x: 0 if x < 128 else 255, '1') 二值化
AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统