机械类专业词汇表自动化:python-docx生成与同步

机械类专业词汇表自动化:python-docx生成与同步 简介《机械类专业词汇表》以 docx 文档形式整理机械工程领域的常用术语面向机械类专业在校学生、备考技术类职业资格的考生以及日常需要查阅中英术语的工程技术人员。文档按汉字笔画顺序编排采用中英对照方式逐条给出简明释义覆盖螺丝批、二极管、力矩与力偶、工程图、电路断路器、工件、工字梁、中央处理器、非铁金属、中密度纤维板、中碳钢等基础概念既便于按笔形快速定位也适合碎片化记忆与课前预习。压缩包内仅含 1 个 docx 文件体积约 46KB轻量易取可直接打印或导入笔记软件使用。目前已有 127 人学习下载。对于需要梳理术语体系、统一中英表达、补齐课堂未记全定义的读者这份词汇表可作为随查随用的基础工具帮助在阅读图纸、技术文档与英文资料时减少理解偏差提升沟通与记录的准确性。1. 机械类专业词汇表.docx 的真正难点不在排版一个机械设计部门最常见的场面是术语表在三个人的电脑上有三份副本一份是十年前老师傅整理的一份是翻译外包回传的还有一份是新人边查边补的。三份文件的正文都叫「机械类专业词汇表」但「形位公差」的英文一会儿是 geometric tolerance一会儿是 form and position tolerance「花键」的缩写栏有人填 spline、有人空着。真正让人头疼的不是 Word 排版好不好看而是这份 docx 背后没有一份可信的结构化数据。它本身就是数据源同时又是交付物这两种身份混在一起才是版本失控的根源。把这份词汇表当成一个可复现的构建产物来看待思路会立刻清晰术语数据存成 CSV、Excel 或 TBX用一段脚本渲染成 docx样式、排序、去重、校对规则全部写进代码。交付出去的那份文件随时可以从数据重新生成改一条术语不用打开 Word 手动找。适合读下去的人有三类负责企业术语库建设的 IT 同学、要给机械客户做多语言交付的技术写作岗、以及需要把零散术语沉淀成可检索文档的研发工程师。2. 机械术语的数据建模字段、来源与 Word 样式的映射渲染脚本写得好不好八成取决于字段设计得对不对。字段一旦定下来后面的排序键、去重键、样式映射、检索方式都是从它推导出来的。所以这一章先把数据模型立住再谈代码。机械术语和普通词条最大的差别在于它天然带单位、带标准号、带符号比如「表面粗糙度 Ra」的 Ra 是符号而不是缩写这两者在排版和检索里的处理方式完全不同。2.1 机械术语条目的最小字段集字段不是越多越好太少又会在渲染时被迫写一堆特判。下面这套字段是在机械、汽车零部件、装备制造这几类术语表里都能直接跑起来的配置。字段名类型示例必填说明cnstring形位公差是中文主词条去重键的第一段enstringgeometric tolerance是英文主词条统一小写后再比对abbrstringGDT否缩写多个用英文分号分隔symbolstringRa否符号或代号渲染时用等宽字体aliaseslist形状公差;位置公差否同义词参与检索不单独建行categorystring公差与配合是分类决定分节和排序主键definitionstring实际要素相对理想要素的允许变动量是定义控制在 60 字以内unitstringmm否单位无单位留空standardstringGB/T 1182否标准号用于溯源sourcestring企标 Q/XX 001否来源翻译交付时必填symbol和abbr分开是踩过坑之后的结论。符号在正文里通常要求斜体或希腊字母缩写要求全大写混在一个字段里渲染时只能靠正则猜遇到「M8」这种既像符号又像规格的条目就会猜错。2.2 从 CSV、Excel、TBX 到内存对象三个来源各有各的脏数据。CSV 的问题是编码和分隔符Excel 的问题是多 sheet 和合并单元格TBX 的问题是嵌套层级深。常见的做法是先统一收敛成一个内存字典列表再做任何渲染动作不要在读取环节就写 Word。# load_terms.py import csv from pathlib import Path REQUIRED (cn, en, category, definition) def load_csv(path: str) - list[dict]: 读取 CSV 术语表统一编码为 utf-8-sig兼容 Excel 另存的 BOM 头 with open(path, encodingutf-8-sig, newline) as f: rows list(csv.DictReader(f)) return [normalize(r) for r in rows] def normalize(row: dict) - dict: 字段清洗去空白、全角分号统一、英文转小写用于比对但保留原值给渲染 item {k: (v or ).strip() for k, v in row.items()} item[aliases] [a for a in item.get(aliases, ).replace(, ;).split(;) if a] item[_en_key] item[en].lower() return item def validate_schema(terms: list[dict]) - list[str]: errs [] for i, t in enumerate(terms, start2): # 从 2 开始对应表格里的真实行号 for field in REQUIRED: if not t.get(field): errs.append(f第 {i} 行缺少必填字段 {field}) return errs if __name__ __main__: terms load_csv(terms.csv) for e in validate_schema(terms): print(e) print(f有效条目 {len(terms)} 条路径 {Path(terms.csv).resolve()})normalize里保留_en_key这类下划线前缀的中间字段是为了让去重和排序用规范化值渲染用原始值。直接改原始数据会在输出里丢掉大写缩写这是很容易忽略的一处。2.3 字段到 Word 样式的映射要写成一张表很多人把字号、颜色直接写在循环里改一次版式要翻遍整个脚本。更稳的做法是把样式抽成配置脚本只负责查表。STYLE_MAP { h1: {style: Heading 1, size: 16}, h2: {style: Heading 2, size: 13}, term_cn: {size: 11, bold: True, font: 宋体}, term_en: {size: 10.5, italic: True, font: Times New Roman}, symbol: {size: 10.5, font: Cambria Math}, definition:{size: 10.5, indent_cm: 0.74}, }映射表里的indent_cm用厘米而不是磅因为 Word 的段落对话框默认显示厘米校对时对齐更直观。分类标题走 Heading 样式好处是后面能自动生成目录、能用导航窗格折叠这一点比手写加粗标题强太多。3. 用 python-docx 把机械术语渲染成 docx数据准备好之后渲染本身并不复杂坑主要集中在中文样式和中英混排上。python-docx 的font.name只影响西文字体中文字体必须通过 XML 的w:eastAsia属性设置否则 Word 里中文会回退成默认字体同一份文件在 Windows 和 WPS 里长得还不一样。3.1 环境准备与最小可跑脚本pip install python-docx pypinyin openpyxl# build_docx.py from docx import Document from docx.shared import Pt, Cm from docx.oxml.ns import qn from load_terms import load_csv def init_document() - Document: doc Document() normal doc.styles[Normal] normal.font.name Times New Roman # 西文字体 normal.font.size Pt(10.5) # 五号字 # 关键中文字体必须写到 eastAsia否则不生效 normal._element.rPr.rFonts.set(qn(w:eastAsia), 宋体) for sec in doc.sections: sec.left_margin sec.right_margin Cm(2.5) return doc def render_table(doc: Document, terms: list[dict]) - None: table doc.add_table(rows1, cols4) table.style Table Grid header [中文名, 英文名, 缩写/符号, 定义] for cell, text in zip(table.rows[0].cells, header): cell.text text for t in terms: row table.add_row().cells row[0].text t[cn] row[1].text t[en] row[2].text t.get(abbr) or t.get(symbol, ) row[3].text t[definition] # 列宽必须在所有单元格上分别设置只改 table.columns 在 Word 里无效 widths [Cm(3.0), Cm(4.5), Cm(2.5), Cm(7.0)] for row in table.rows: for cell, w in zip(row.cells, widths): cell.width w table.autofit False if __name__ __main__: terms load_csv(terms.csv) doc init_document() render_table(doc, terms) doc.save(机械类专业词汇表.docx)两个容易翻车的地方一是cell.width必须逐单元格写改table.columns[i].width在部分 Word 版本里不生效二是autofit要显式关掉否则 Word 打开时会按内容重新计算列宽中英混排的表格瞬间变形。3.2 表格版和段落版该选哪个给翻译公司交付选表格版一列中文一列英文Trados 之类的工具导入时列对应关系最省事。给设计和工艺岗当查询手册用选段落版每个词条一段中文、一段英文、一段定义翻页时视觉负担小。两种版式可以共用同一份数据只是渲染函数不同。场景版式优点代价翻译交付四列或五列表格列对齐明确工具识别率高长定义撑行跨页时表头易丢内部查询手册段落 样式标题可生成目录便于检索条目多时页数上涨明显数据库导入底稿纯段落字段用制表符二次解析简单人眼阅读体验差打印签核表格 重复表头纸质归档规范需手动控制分页段落版渲染时每条术语用一个 Heading 3 级别的小标题承载中文名紧跟一段斜体英文再跟定义段落。标题级别不要乱用 Heading 1否则自动目录会被上百个词条撑爆。3.3 字号、列宽、分页和页眉的参数怎么调# 表格跨页时重复表头行 def repeat_header(table) - None: tr table.rows[0]._tr trPr tr.get_or_add_trPr() tblHeader trPr.makeelement(qn(w:tblHeader), {}) trPr.append(tblHeader) # 词条之间禁止被分页拆开段落版 def keep_together(paragraph) - None: paragraph.paragraph_format.keep_with_next TruetblHeader是 Word 里「重复标题行」的 XML 表示python-docx 没有高层 API只能这样加。keep_with_next让中文词条和它下面的英文、定义不被拆到两页段落版里几乎是必设项。参数推荐值调整时机正文西文字号10.5 pt词条超过 2000 条时降到 10 pt中文正文字体宋体屏幕阅读为主可换等线符号字段字体Cambria Math出现希腊字母时必须换页边距上下 2.5 cm / 左右 2.5 cm四列表格建议左侧留 2 cm定义字段缩进0.74 cm与中文名首字对齐表头重复开启表格超过一页必开页眉放文档名和版本号页脚放「第 X 页 共 Y 页」这两个用域代码实现脚本里生成域比手动插入更可靠。4. 去重、排序与校验生成前的三道质检直接从多人手里收集来的术语表重复率通常在 8% 到 15% 之间而且重复的形式很隐蔽中文一样英文不同、英文一样大小写不同、缩写重复但中文是近义词。不做质检直接渲染输出来的 docx 拿出去会很难看。4.1 去重键怎么定只按中文名去重会漏掉「中文不同英文相同」的情况只按英文去重会误杀「同一英文对应多个中文概念」的合理条目比如 bearing 在不同语境下是轴承也可能是方位角。稳妥的做法是主键用中文名辅助键用英文小写两者任一命中就进人工确认队列而不是直接删。def dedup(terms: list[dict]) - tuple[list[dict], list[dict]]: 返回 (保留条目, 待人工确认条目)不静默删除任何数据 kept, conflicts, seen_cn, seen_en [], [], {}, {} for t in terms: cn, en t[cn], t[_en_key] if cn in seen_cn or en in seen_en: t[_reason] f与 {seen_cn.get(cn) or seen_en.get(en)} 冲突 conflicts.append(t) continue seen_cn[cn] cn seen_en[en] cn kept.append(t) return kept, conflicts冲突条目单独导出一份 CSV 交给术语负责人裁决这比脚本里 print 一堆警告有用得多因为裁决结果要能回写到源文件。4.2 中文按拼音排、英文按字母排机械术语表的排序一般是「分类 → 中文拼音」因为现场工程师翻手册是按中文找的。直接用sorted(keylambda t: t[cn])会得到 Unicode 码点顺序中文部分基本等于乱序。from pypinyin import lazy_pinyin, Style def sort_key(t: dict): # 分类权重用字典映射保证「公差与配合」永远排在「热处理」前面 order CATEGORY_ORDER.get(t[category], 999) # 拼音排序时忽略大小写和空格多音字交给 pypinyin 的默认策略 py .join(lazy_pinyin(t[cn], styleStyle.NORMAL)) return (order, py, t[_en_key])多音字在机械领域不算少「轴承」的「轴」读 zhóu「花键轴」也是。「重」在「重载」里读 zhòng在「重复定位精度」里读 chóng。pypinyin 默认词典覆盖了大部分常见词遇到「重」开头的条目建议在词表里给该条加一个隐形字段_pinyin_override用配置覆盖默认读音别去改库。4.3 校验规则表与失败日志渲染前跑一遍规则校验把问题落成一份validate_report.csv比在控制台里翻屏找报错高效。规则检查内容处理方式空值cn / en / category / definition 为空阻断不入库长度definition 超过 120 字警告建议拆分或精炼大小写英文首字母是否统一大写警告自动修正全角符号中文字段里出现全角逗号句号自动替换缩写格式abbr 超过 6 个字符警告疑似误填标准号格式standard 未匹配 GB/T 或 ISO 前缀警告人工确认单位一致性symbol 为 Ra 但 unit 填了 mm警告疑似错行import csv def write_report(rows: list[dict], path: str validate_report.csv) - None: fields [level, row_no, cn, field, message] with open(path, w, encodingutf-8-sig, newline) as f: writer csv.DictWriter(f, fieldnamesfields) writer.writeheader() writer.writerows(rows)提示校验报告和术语源文件都放进版本控制出问题时能直接 diff 出是哪一条术语在哪次提交里被改坏的。只有level error的条目被拦下来warning 全部放过并写进报告这样既保证了输出不崩又不会因为一条单位可疑就把整份词汇表卡住。5. 让机械类专业词汇表.docx 可检索、可同步5.1 用书签和内部超链接做一份可跳转的分类索引词条超过 500 条之后靠滚动找一条术语非常痛苦。在文档开头生成一份分类索引每行链接到对应分类的书签翻起来就顺了。python-docx 没有书签和内部链接的高层 API需要写一点 XML。from docx.oxml.ns import qn from docx.oxml import OxmlElement def add_bookmark(paragraph, name: str, bid: int) - None: start OxmlElement(w:bookmarkStart) start.set(qn(w:id), str(bid)) start.set(qn(w:name), name) end OxmlElement(w:bookmarkEnd) end.set(qn(w:id), str(bid)) paragraph._p.insert(0, start) paragraph._p.append(end) def add_internal_link(paragraph, anchor: str, text: str) - None: link OxmlElement(w:hyperlink) link.set(qn(w:anchor), anchor) # 对应书签名不带 # run OxmlElement(w:r) t OxmlElement(w:t) t.text text run.append(t) link.append(run) paragraph._p.append(link)书签名的规则比想象中严格不能以数字开头不能含空格和大多数标点超过 40 个字符 Word 会自动截断。用bm_cat_公差与配合这种形式在中文 Word 里能正常跳转但如果这份文件还要走 PDF 转换或在线预览建议把书签名换成bm_cat_001这类纯 ASCII显示文本仍然是中文。分类标题段落上挂书签索引里引用同一个锚点改分类名时只需要改显示文本。5.2 docx 与 TBX、CSV 的双向同步单向生成只能解决一半问题术语负责人在 Word 里改错别字是拦不住的。落地做法是给 docx 里的表格加一个隐藏列存条目 ID用一个回读脚本把改动抽回来覆盖源 CSV冲突时以源文件为准并写日志。def read_back(docx_path: str) - list[dict]: 从校对后的 docx 表格里回读术语依赖隐藏的第一列 _id from docx import Document doc Document(docx_path) out [] for table in doc.tables: for row in table.rows[1:]: cells [c.text.strip() for c in row.cells] if len(cells) 5 and cells[0]: out.append({_id: cells[0], cn: cells[1], en: cells[2], abbr: cells[3], definition: cells[4]}) return out隐藏列的实现方式是把列宽设成极小并加白色字体或者干脆用w:vanish让整行在打印时隐藏。回读脚本要做的第一件事是对比_id集合源文件里有而 docx 里消失的条目说明有人删了行这类删除必须人工确认不能自动同步。TBX 那边用xml.etree.ElementTree直接对接termEntry节点即可TBX 的langSet天然对应中英两列字段映射比 CSV 还直接。最后一步是把脚本串成一条命令读源文件 → 校验 → 渲染 docx → 回读比对 → 输出差异报告跑通一次之后这份机械类专业词汇表.docx 就再也不用靠人手一份地传了。本文还有配套的精品资源点击获取