一、开发环境准备与依赖库安装
在开始整理孤儿院档案之前,我们需要构建一个基于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')
```

执行此脚本后,所有能匹配到姓名的文件都会被移动到 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') 二值化