Python实现医院档案自动识别与归档实操指南

环境准备与依赖安装

在开始编写代码之前,必须先配置好Python运行环境以及OCR识别引擎。本方案基于Python 3.9版本开发,利用Tesseract-OCR进行图像文字识别,使用Pandas处理档案数据。

1. 安装Python环境

如果你的电脑尚未安装Python,请访问Python官网下载Windows installer安装包。下载地址为:https://www.python.org/downloads/release/python-3913/。安装时,务必勾选底部的"Add Python to PATH"选项,这将避免后续在命令行中无法识别python命令的问题。安装完成后,在CMD中输入python --version,显示版本号即表示安装成功。

2. 安装Tesseract-OCR引擎

Python需要调用Tesseract引擎来识别图片中的文字。请下载Windows版本的安装包。下载地址为:https://github.com/UB-Mannheim/tesseract/wiki。进入页面后,找到tesseract-ocr-w64-setup-5.3.0.20221207.exe(64位版本)进行下载。

安装过程中,务必记住安装路径,默认路径通常为C:\Program Files\Tesseract-OCR。安装完成后,必须将Tesseract的安装目录添加到系统环境变量Path中。具体操作为:右键“此电脑”-> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> Path -> 编辑 -> 新建 -> 输入C:\Program Files\Tesseract-OCR。配置完成后,重启CMD终端,输入tesseract --version进行验证。

3. 安装Python依赖库

打开CMD终端,依次执行以下命令安装所需的第三方库。这些库分别用于OCR识别、图像处理、数据存储和文件操作:

```bash pip install pytesseract pillow pandas openpyxl shutil ```
  • pytesseract:Python的Tesseract封装包,用于调用OCR接口。
  • pillow:Python图像处理标准库,用于打开和处理扫描件图片。
  • pandas:用于生成Excel档案索引表。
  • openpyxl:用于读写Excel 2010+ (.xlsx) 文件。

档案整理逻辑与目录设计

在实际操作中,医院档案通常以扫描件(PDF或JPG/PNG)形式散落在文件夹中。我们的目标是:识别图片中的“患者姓名”和“病历号”,根据“科室”重命名文件,并将其移动到按日期分类的文件夹中,最后生成一份Excel索引表。

请在D盘根目录下创建以下文件夹结构用于测试:

  • D:\Hospital_Archive(总根目录)
  • D:\Hospital_Archive\source_files(存放待处理的原始扫描件)
  • D:\Hospital_Archive\sorted_files(存放处理后的归档文件)
  • D:\Hospital_Archive\tessdata(存放中文语言包,如果Tesseract默认路径没有中文包,需手动下载chi_sim.traineddata放入此目录)

核心代码实现步骤

创建一个名为archive_organizer.py的文件。为了确保代码能够直接运行,我们将代码分为配置部分、OCR识别部分、文件处理部分和主逻辑部分。

1. 引入库与配置路径

Python实现医院档案自动识别与归档实操指南

代码开头需要指定Tesseract的执行路径。如果你修改了默认安装位置,请务必修改下方代码中的pytesseract.pytesseract.tesseract_cmd变量。

```python import os import shutil import pandas as pd import pytesseract from PIL import Image import re import datetime 指定Tesseract可执行文件的路径,请根据实际安装路径修改 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' 定义文件夹路径 SOURCE_DIR = r'D:\Hospital_Archive\source_files' OUTPUT_DIR = r'D:\Hospital_Archive\sorted_files' EXCEL_OUTPUT = r'D:\Hospital_Archive\archive_index.xlsx' ```

2. 定义OCR识别与信息提取函数

此函数负责打开图片,提取中文和数字文本,并使用正则表达式匹配关键信息。这里假设扫描件的文件名或内容中包含“姓名:张三”和“病案号:123456”的格式。如果图片排版固定,需要调整正则表达式。

```python def extract_info_from_image(image_path): try: 打开图片 img = Image.open(image_path) 使用Tesseract识别,指定中文简体和英文数字混合识别 lang='chi_sim+eng' 表示同时加载中文和英文语言包 text = pytesseract.image_to_string(img, lang='chi_sim+eng') 初始化字典 info = { 'filename': os.path.basename(image_path), 'patient_name': '未知', 'record_id': '未知', 'department': '未知' } 使用正则表达式提取信息(需根据实际单据格式修改模式) 示例:查找 "姓名:张三" 或 "Name:ZhangSan" name_match = re.search(r'(姓名[::]\s([^\s\n]+))|(Name[::]\s([^\s\n]+))', text) if name_match: 提取匹配到的组,去除冒号 raw_name = name_match.group(0).replace('姓名', '').replace('Name', '').replace(':', '').replace(':', '').strip() info['patient_name'] = raw_name 示例:查找 "病案号:2023001" 或纯数字序列 id_match = re.search(r'(病案号|ID|No)[::]\s(\d+)', text) if id_match: info['record_id'] = id_match.group(2) else: 如果没有明确标签,尝试提取文档中的第一个长数字(假设大于6位的是ID) num_match = re.search(r'\d{6,}', text) if num_match: info['record_id'] = num_match.group(0) 核心逻辑:根据文件名或ID推断科室(模拟业务逻辑) 假设文件名包含"Internal"即为内科 if 'Internal' in info['filename'] or '内科' in text: info['department'] = '内科' elif 'Surgery' in info['filename'] or '外科' in text: info['department'] = '外科' return info except Exception as e: print(f"识别文件 {image_path} 失败: {e}") return None ```

3. 定义文件归档与重命名函数

该函数根据提取的信息,创建以“年-月”为单位的子文件夹,并将文件重命名为“姓名_病历号.后缀”,然后移动到新文件夹。

```python def move_and_rename_file(file_info, source_path, output_base_dir): if not file_info: return 获取当前日期用于生成月份文件夹 current_date = datetime.datetime.now() folder_name = current_date.strftime('%Y-%m') 构建目标科室文件夹路径 target_dir = os.path.join(output_base_dir, folder_name, file_info['department']) 如果文件夹不存在,则创建 if not os.path.exists(target_dir): os.makedirs(target_dir) 获取原文件后缀 file_ext = os.path.splitext(file_info['filename'])[1] 构建新文件名:姓名_病历号.后缀 new_filename = f"{file_info['patient_name']}_{file_info['record_id']}{file_ext}" target_path = os.path.join(target_dir, new_filename) 处理重名问题 counter = 1 while os.path.exists(target_path): name_part = f"{file_info['patient_name']}_{file_info['record_id']}_{counter}" target_path = os.path.join(target_dir, name_part + file_ext) counter += 1 try: 移动文件 shutil.move(source_path, target_path) print(f"已归档: {file_info['filename']} -> {target_path}") return target_path except Exception as e: print(f"移动文件失败: {e}") return None ```

完整脚本整合与执行

将上述函数整合,加入主循环逻辑。该脚本将遍历源文件夹,处理每一个支持的图片文件,并生成Excel报表。

```python def main(): 用于存储所有档案信息,最后导出Excel archive_data = [] 检查源目录是否存在 if not os.path.exists(SOURCE_DIR): print(f"源目录不存在: {SOURCE_DIR}") return 支持的图片格式 valid_extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff'] 遍历源目录 files = os.listdir(SOURCE_DIR) total_files = len(files) print(f"开始处理,共发现 {total_files} 个文件。") for index, filename in enumerate(files): file_path = os.path.join(SOURCE_DIR, filename) 跳过非图片文件 if not os.path.isfile(file_path): continue ext = os.path.splitext(filename)[1].lower() if ext not in valid_extensions: print(f"跳过非图片文件: {filename}") continue print(f"正在处理 ({index+1}/{total_files}): {filename}") 1. 识别信息 info = extract_info_from_image(file_path) if info: 2. 移动并重命名 final_path = move_and_rename_file(info, file_path, OUTPUT_DIR) 3. 记录数据 info['final_path'] = final_path info['process_time'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') archive_data.append(info) 4. 导出Excel索引表 if archive_data: df = pd.DataFrame(archive_data) 重新排列列顺序 df = df[['process_time', 'filename', 'patient_name', 'record_id', 'department', 'final_path']] 重命名列头 df.columns = ['处理时间', '原始文件名', '患者姓名', '病案号', '科室', '归档路径'] try: df.to_excel(EXCEL_OUTPUT, index=False, engine='openpyxl') print(f"\n处理完成!索引表已生成: {EXCEL_OUTPUT}") except Exception as e: print(f"生成Excel失败: {e}") else: print("未处理任何有效文件。") if __name__ == '__main__': main() ```

操作注意事项与常见错误排查

运行上述脚本前,请确保在source_files目录中放入几张测试用的图片。图片内容尽量清晰,且包含明确的“姓名”和数字编号。

1. 识别率低的问题

如果OCR提取的姓名或ID全是乱码,通常是因为图片分辨率过低或字体过于潦草。可以在代码中加入图像预处理步骤,如将图片转换为灰度并调整对比度:

```python 在extract_info_from_image函数中,img = Image.open(image_path)之后加入: img = img.convert('L') 转灰度 img = img.resize((int(img.width 2), int(img.height 2)), Image.LANCZOS) 放大2倍 ```

2. 中文语言包缺失错误

运行时如果报错Failed loading language 'chi_sim',说明Tesseract未找到中文语言包。请下载chi_sim.traineddata文件,并将其复制到Tesseract安装目录下的tessdata文件夹中(例如C:\Program Files\Tesseract-OCR\tessdata)。

3. 路径包含空格或中文名

虽然Python 3对中文路径支持较好,但在某些旧版Windows系统中,Tesseract调用包含中文路径的图片可能会报错。建议所有的输入输出文件夹路径(D盘目录)均只使用英文和下划线,避免出现中文路径。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统