档案数据标准化从零开始实操用Python批量清洗加快速修正常见错误

第一步:准备标准化基础规则表(Excel)

标准化规则是所有操作的核心,必须先完成,可直接复制以下模板填写。

模板要求:新建一个名为“档案标准化规则.xlsx”的Excel文件,包含2个工作表,分别命名为“字典规则”“格式规则”。

1.1 字典规则表(必填)

用于统一分类、籍贯、学历等有固定选项的字段,结构如下:

  • A列:待标准化的字段名,如“籍贯”
  • B列:标准值,如“广东省广州市天河区”
  • C列:需替换的非标准值,多个用英文逗号分隔,如“广州天河,广州市天河,广州天河区”

示例字典规则内容(可直接复制前3行表头+1条数据后扩展):

``` 待标准化字段名 标准值 需替换的非标准值 学历 本科 本科毕业,大本,统招本科 ```

1.2 格式规则表(必填)

用于规范身份证号、归档日期、页数等格式字段,结构如下:

  • A列:待标准化的字段名
  • B列:规则类型,选“身份证”“归档日期”“数字”“固定长度”其中之一
  • C列:补充参数(规则类型为“固定长度”必填,其他为空),如固定长度为8的归档日期补充“8”

示例格式规则内容(可直接复制前3行表头+2条数据后扩展):

``` 待标准化字段名 规则类型 补充参数 身份证号 身份证 归档日期 固定长度 8 ```

第二步:安装Python及依赖库

要求环境:Windows 10/11、macOS 10.15+(Linux同理,命令略改)

2.1 安装Python

直接访问Python官方下载页面:https://www.python.org/downloads/release/python-31110/,下载对应系统的“Windows installer (64-bit)”或“macOS 64-bit universal2 installer”

安装注意(Windows必看):打开安装包后,必须勾选界面底部的“Add Python 3.11 to PATH”,然后点击“Install Now”默认安装即可。

2.2 安装操作依赖库

按以下步骤打开命令行工具:

  • Windows:按Win+R键,输入cmd,回车
  • macOS:按Command+空格键,搜索“终端”,回车

档案数据标准化从零开始实操用Python批量清洗加快速修正常见错误

复制以下命令并粘贴到命令行,回车执行:

``` pip install pandas openpyxl python-Levenshtein ```

卡壳处理:若提示“pip不是内部或外部命令”,Windows重新勾选PATH后重启电脑,macOS搜索“如何配置Python 3.11环境变量”补充(1分钟操作)。

第三步:编写Python批量清洗脚本

在桌面新建一个名为“档案标准化”的文件夹,将刚才的“档案标准化规则.xlsx”和待清洗的“待标准化档案.xlsx”放入该文件夹。

在“档案标准化”文件夹内,右键新建“文本文档”,重命名为“standardize.py”(注意后缀名改为.py,Windows需先开启“文件扩展名”显示:Win11资源管理器顶部“查看”→勾选“显示”组的“文件扩展名”)。

右键点击“standardize.py”,选择“打开方式”→“记事本”,复制以下完整代码并粘贴,无需修改直接保存

```python import pandas as pd import re from Levenshtein import distance def load_rules(rule_path): rule_dict = {} rule_format = {} df_dict = pd.read_excel(rule_path, sheet_name='字典规则') for _, row in df_dict.iterrows(): field = row['待标准化字段名'] if pd.isna(field): continue if field not in rule_dict: rule_dict[field] = {} std_val = row['标准值'] if pd.isna(std_val): continue non_std_vals = row['需替换的非标准值'] if not pd.isna(non_std_vals): for val in str(non_std_vals).split(','): rule_dict[field][val.strip()] = std_val df_format = pd.read_excel(rule_path, sheet_name='格式规则') for _, row in df_format.iterrows(): field = row['待标准化字段名'] if pd.isna(field): continue rule_format[field] = { 'type': row['规则类型'], 'param': row['补充参数'] if not pd.isna(row['补充参数']) else None } return rule_dict, rule_format def clean_dict(field, val, rule_dict): if field not in rule_dict or pd.isna(val): return val val_str = str(val).strip() if val_str in rule_dict[field]: return rule_dict[field][val_str] 相似度匹配(模糊匹配阈值设为0.7,可自行调整) best_match = None min_dist = float('inf') for non_std, std in rule_dict[field].items(): d = distance(val_str, non_std) max_len = max(len(val_str), len(non_std)) sim = 1 - d / max_len if sim >= 0.7 and d < min_dist: min_dist = d best_match = std return best_match if best_match else val def clean_format(field, val, rule_format): if field not in rule_format or pd.isna(val): return val val_str = str(val).strip() r_type = rule_format[field]['type'] param = rule_format[field]['param'] if r_type == '身份证': 身份证基础校验+补X大写 if re.match(r'^\d{17}[\dXx]$', val_str): return val_str.upper() return val_str elif r_type == '固定长度': 仅保留数字/字母,补前导0 val_num = re.sub(r'[^0-9a-zA-Z]', '', val_str) return val_num.zfill(int(param))[:int(param)] elif r_type == '数字': 仅保留整数或小数 num_match = re.search(r'^\d+(\.\d+)?$', val_str) return num_match.group() if num_match else val_str elif r_type == '归档日期': 仅保留8位数字格式 val_num = re.sub(r'[^0-9]', '', val_str) return val_num[:8] if len(val_num)>=8 else val_str return val def main(): rule_path = '档案标准化规则.xlsx' data_path = '待标准化档案.xlsx' output_path = '已标准化档案.xlsx' log_path = '标准化修正日志.xlsx' try: rule_dict, rule_format = load_rules(rule_path) df = pd.read_excel(data_path) log = [] for idx, row in df.iterrows(): for col in df.columns: original = row[col] cleaned = clean_dict(col, original, rule_dict) cleaned = clean_format(col, cleaned, rule_format) if str(original).strip() != str(cleaned).strip(): log.append({ '行号': idx + 2, '字段名': col, '原始值': original, '标准化值': cleaned }) df.at[idx, col] = cleaned df.to_excel(output_path, index=False) pd.DataFrame(log).to_excel(log_path, index=False) print(f'✅ 标准化完成!已生成文件:{output_path}、{log_path}') except Exception as e: print(f'❌ 出错了:{str(e)}') if __name__ == '__main__': main() ```

第四步:执行脚本并验证结果

4.1 执行脚本

打开“档案标准化”文件夹,在地址栏输入cmd,回车打开命令行,复制以下命令并粘贴,回车执行:

``` python standardize.py ```

4.2 查看生成的文件

执行成功后会生成2个新文件:

  • 已标准化档案.xlsx:直接使用的最终结果
  • 标准化修正日志.xlsx:记录所有修改内容,便于人工二次复核

4.3 二次硬校验(Excel操作,5分钟内完成)

打开“已标准化档案.xlsx”,按以下步骤做双向校验:

字典规则校验:

  1. 选中有字典规则的列,如“学历”
  2. 点击“数据”选项卡→“数据验证”
  3. “允许”选“序列”,“来源”输入该列所有标准值(用英文逗号分隔),如“本科,专科,高中”
  4. 点击“出错警告”→勾选“输入无效数据时显示出错警告”,样式选“停止”,确定

格式规则校验:

  1. 选中有格式规则的列,如“身份证号”
  2. 点击“开始”选项卡→“条件格式”→“突出显示单元格规则”→“其他规则”
  3. “选择规则类型”选“使用公式确定要设置格式的单元格”
  4. 输入公式(以身份证号列A列为例,A2是第一个数据单元格):=NOT(AND(LEN(A2)=18,OR(ISNUMBER(--LEFT(A2,17)),MID(A2,18,1)="X",MID(A2,18,1)="x")))
  5. 点击“格式”→“填充”→选红色,确定

校验后红色单元格或弹出停止警告的单元格,对照“标准化修正日志.xlsx”和原始档案人工修正即可。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统