技能|Word文档纯标准库读写与备份法
适用场景
不能/不该装第三方库(离线环境、零依赖约束)却要读写 .docx 时:读正文、转 HTML 展示、改条款写回、批量处理。触发词:装不了 python-docx、docx 读写、保表格、写前自动备份。
操作步骤
- 认知前提:
.docx就是一个 zip 包,正文在word/document.xml,样式、关系、资源各在其位。绝不能用纯文本替换的思路改内容。 - 读取三件套:打开包 → 取
word/document.xml→ 用标准库 XML 解析器解析。段落是w:p,表格是w:tbl,文本在w:t,格式在w:rPr。 - 提取正文:遍历
w:t拼接;严格区分"正文直属段落"与"表格内段落"——统计段落数/行距时若把表格算进去,数字会离谱(曾因此多算几十行)。 - 转 HTML 展示:按段落与样式映射(标题层级 / 加粗 / 对齐 / 列表),表格单独渲染;缓存 key 用 文件大小 + 纳秒级修改时间,文件一改指纹即变。
- 写回(唯一出口):自动备份到
<同目录>/_备份/<日期>/→ 全量读进内存 → 替换目标 XML → 写临时 zip → 原子覆盖。禁止在同一包句柄里先写后读。 - 写后校验三件事:压缩包完整无损坏;核心 XML 可解析;内容类型清单仍在。
- 命名护栏:Windows 保留设备名(
nul/con/aux/com1…)不可用作文件名或目录名;生成与备份两处都要忽略这类条目,否则建出幽灵文件删不掉。
注意边界
- 页面边距读
w:sectPr/w:pgMar,别猜默认值。 - 写回只动目标节点,复用原 run 的
rPr,保住加粗与字体。 - 备份目录必须排除在"扫描源文件"之外,否则备份里的旧版本被当成新文件重复计入。
反例避雷
- 直接字符串替换
document.xml→ 破坏 XML 转义,文件打不开。 - 同一句柄先写后读 → 读到脏数据或抛异常。
- 用
nul之类保留名建文件 → 系统里删不掉,备份脚本每次都卡住。 - 忘记排除备份目录 → 文件数翻倍、指纹抖动、展示层出现旧版本。
- 写完不校验压缩包 → 损坏到下次打开才发现,且备份已被覆盖。
关联笔记
- [[技能|制度条款冲突合并与多文件同步改写SOP]]
- [[技能|Word母本驱动的表单自动生成流程]]
- [[技能|废弃数据源清理三步法]]
实战战绩
2026-09-28 首跑:纯标准库完成 78 份单制度 + 10 份域汇编 + 1 份总册的读取、展示与写回;写回全部自动备份,压缩包与 XML 校验均通过;保留名护栏拦下 1 个 nul 条目,避免建出删不掉的文件。
版本记录
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.0.0 | 2026-09-28 | 首版实战固化:zip+XML 读写→正文/表格区分→指纹缓存→写回备份→三校验 |