网站首页/ 信息中心/ 档案百科/

手把手教你用Python自动化整理混乱的协议文档档案

发布时间:2026年08月16日 15:55:04 浏览量:0

环境准备与依赖安装

在进行协议档案整理之前,我们需要搭建一个纯净的 Python 运行环境。本指南基于 Python 3.8 及以上版本编写,利用 python-docx 库来处理 Word 文档,利用 re 库进行正则匹配提取关键信息。请确保你的系统中已经安装了 Python。

打开终端或命令行工具,执行以下命令安装核心依赖库:

pip install python-docx

如果安装速度较慢,建议使用国内镜像源进行安装:

pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后,新建一个项目文件夹,例如命名为 protocol_organizer,并在该文件夹下创建一个名为 source_docs 的子文件夹,用于存放待处理的原始 Word 协议文档。

定义协议文档的数据规范

为了确保脚本能准确提取信息,我们需要假设并规范输入的 Word 文档格式。在实际业务中,混乱的协议通常包含特定的关键字段。本脚本将针对以下标准格式进行解析,如果你的文档格式不同,请参照后续代码中的正则表达式部分进行修改。

假设每个 Word 文档(.docx)的内容结构如下:

我们的目标是将这些零散的 Word 文件转换成结构化的 Markdown 文件,并按照“协议编号_协议名称.md”的格式重命名,统一存放在 output_docs 目录中。

生成测试用的Word协议文档

为了让你能立即上手验证效果,我们先编写一个辅助脚本,在 source_docs 目录下生成 3 个模拟的混乱协议文档。请在项目根目录下创建 generate_dummy_data.py,并写入以下代码:

import os
from docx import Document
确保源文件夹存在
source_dir = "source_docs"
if not os.path.exists(source_dir):
os.makedirs(source_dir)
模拟数据
dummy_data = [
{
"filename": "messy_doc_1.docx",
"content": [
"协议名称:外部数据接口对接协议",
"编号:PROTO-2023-001",
"日期:2023-05-12",
"本协议旨在规范系统A与系统B之间的数据交互...",
"1. 接口地址:/api/v1/data/sync",
"2. 请求方式:POST"
]
},
{
"filename": "messy_doc_2.docx",
"content": [
"协议名称:用户隐私保密协议",
"编号:LEGAL-2023-088",
"日期:2023-06-20",
"甲方承诺保护乙方的用户隐私数据...",
"严禁未经授权的第三方访问。"
]
},
{
"filename": "messy_doc_3.docx",
"content": [
"协议名称:服务器运维SLA保障协议",
"编号:OPS-2023-105",
"日期:2023-07-01",
"服务可用性承诺达到99.9%...",
"故障响应时间不超过15分钟。"
]
}
]
for item in dummy_data:
doc = Document()
for line in item["content"]:
doc.add_paragraph(line)
doc.save(os.path.join(source_dir, item["filename"]))
print(f"已生成测试文件: {item['filename']}")

在终端运行该脚本:

手把手教你用Python自动化整理混乱的协议文档档案

python generate_dummy_data.py

运行成功后,你将在 source_docs 中看到三个生成的 Word 文件。接下来,我们将编写核心脚本来整理这些文件。

编写核心解析与转换脚本

在项目根目录下创建主程序文件 organize.py。该脚本将读取 source_docs 下的所有文件,提取关键信息,并转换为 Markdown 格式。

import os
import re
from docx import Document
定义输入和输出目录
INPUT_DIR = "source_docs"
OUTPUT_DIR = "output_docs"
def extract_protocol_info(doc_path):
"""
解析Word文档,提取协议名称、编号、日期和正文
"""
doc = Document(doc_path)
full_text = []
读取所有段落文本
for para in doc.paragraphs:
full_text.append(para.text)
初始化变量
protocol_name = "未知协议"
protocol_id = "UNKNOWN-ID"
sign_date = "1970-01-01"
body_content = []
使用正则表达式提取关键信息
注意:这里假设格式严格,实际生产中可能需要更复杂的模糊匹配
for line in full_text:
if "协议名称:" in line:
protocol_name = line.split(":", 1)[1].strip()
elif "编号:" in line:
protocol_id = line.split(":", 1)[1].strip()
elif "日期:" in line:
sign_date = line.split(":", 1)[1].strip()
else:
剩余内容归为正文
if line.strip():  过滤空行
body_content.append(line.strip())
return {
"name": protocol_name,
"id": protocol_id,
"date": sign_date,
"body": "\n".join(body_content),
"original_filename": os.path.basename(doc_path)
}
def save_to_markdown(data):
"""
将提取的数据保存为Markdown文件
"""
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
构造新文件名:编号_名称.md
清理文件名中的非法字符
safe_name = re.sub(r'[\\/?:"<>|]', "", data["name"])
new_filename = f"{data['id']}_{safe_name}.md"
output_path = os.path.join(OUTPUT_DIR, new_filename)
构造Markdown内容
md_content = f""" {data['name']}
协议编号: {data['id']}
签署日期: {data['date']}
原始文件: {data['original_filename']}
正文内容
{data['body']}
"""
with open(output_path, 'w', encoding='utf-8') as f:
f.write(md_content)
return output_path
def main():
files = os.listdir(INPUT_DIR)
doc_files = [f for f in files if f.endswith('.docx')]
if not doc_files:
print(f"在 {INPUT_DIR} 目录下未找到 .docx 文件。")
return
print(f"开始处理,共发现 {len(doc_files)} 个文件...")
for filename in doc_files:
file_path = os.path.join(INPUT_DIR, filename)
try:
info = extract_protocol_info(file_path)
saved_path = save_to_markdown(info)
print(f"[成功] {filename} -> {os.path.basename(saved_path)}")
except Exception as e:
print(f"[失败] 处理文件 {filename} 时出错: {e}")
if __name__ == "__main__":
main()

这段代码包含了完整的解析逻辑。extract_protocol_info 函数负责读取 Word 文件并使用字符串分割和正则清洗提取字段;save_to_markdown 函数负责构造标准的 Markdown 语法并写入文件。特别注意文件名处理部分,使用了 re.sub 去除协议名称中可能存在的 Windows 文件系统非法字符,防止脚本报错。

批量处理与归档逻辑实现

虽然上述脚本已经实现了单文件处理,但在实际整理协议档案时,我们往往需要按年份或类型进行二级归档。我们可以对 organize.py 进行简单的扩展,增加按年份分类的功能。

修改 save_to_markdown 函数以及 main 函数的调用逻辑,增加年份参数:

def save_to_markdown(data):
"""
将提取的数据保存为Markdown文件,并按年份归档
"""
从日期中提取年份,假设日期格式为 YYYY-MM-DD
year = data["date"].split("-")[0]
构造输出目录:output_docs/YYYY
year_output_dir = os.path.join(OUTPUT_DIR, year)
if not os.path.exists(year_output_dir):
os.makedirs(year_output_dir)
清理文件名
safe_name = re.sub(r'[\\/?:"<>|]', "", data["name"])
new_filename = f"{data['id']}_{safe_name}.md"
output_path = os.path.join(year_output_dir, new_filename)
构造Markdown内容
md_content = f""" {data['name']}
协议编号: {data['id']}
签署日期: {data['date']}
原始文件: {data['original_filename']}
正文内容
{data['body']}
"""
with open(output_path, 'w', encoding='utf-8') as f:
f.write(md_content)
return output_path

通过这一修改,脚本在保存文件时会自动检查“签署日期”字段,提取年份(如 2023),并在 output_docs 下创建对应的子文件夹。这样,即便有数百个协议文件,也能自动散列到不同的年份目录中,实现清晰的档案分层管理。

运行脚本与结果验证

所有代码准备就绪后,直接在终端运行整理脚本:

python organize.py

终端将输出处理日志:

开始处理,共发现 3 个文件...
[成功] messy_doc_1.docx -> PROTO-2023-001_外部数据接口对接协议.md
[成功] messy_doc_2.docx -> LEGAL-2023-088_用户隐私保密协议.md
[成功] messy_doc_3.docx -> OPS-2023-105_服务器运维SLA保障协议.md

此时,打开项目文件夹,你会发现多出了一个 output_docs 文件夹。进入该文件夹,你会看到文件已经被自动分类在 2023 子目录下。打开任意一个 Markdown 文件,你会看到原本散落在 Word 中的内容已经被格式化为标准的标题、元数据列表和正文。

例如,PROTO-2023-001_外部数据接口对接协议.md 的内容如下:

 外部数据接口对接协议
协议编号: PROTO-2023-001
签署日期: 2023-05-12
原始文件: messy_doc_1.docx
正文内容
本协议旨在规范系统A与系统B之间的数据交互...
1. 接口地址:/api/v1/data/sync
2. 请求方式:POST

至此,你已完成了一套完整的协议档案自动化整理流程。这套方案不仅适用于协议整理,稍作修改正则匹配规则,即可应用于合同归档、发票处理或任何基于固定模板的文档批处理场景。

太原档案数字化服务流程是怎样的?大概需要多少钱?
太原档案数字化服务流程是怎样的?大概需要多少钱?
太原档案数字化服务通常包含需求分析、方案制定、现场整理、扫描加工、数据挂接、验收交付等核心流程,费用根据档案数量、纸张状况、数字化标准等因素综合计算,2026年市场价格范围大致在每页0.5元至2元之间...
2026年08月16日 15:55:04
微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818