python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python提取Word转Markdown

Python实现快速提取Word表格并转Markdown

作者:Python测试之道

这篇文章主要为大家详细介绍了一套Python零基础可操作的代码方案,帮助测试工程师3分钟内完成表格提取与转换,直接对接自动化测试或大模型,需要的小伙伴可以参考下

一、为什么需要这个工具

在测试工作中,我们常遇到这样的场景:

本文提供一套零基础可操作的代码方案,帮助测试工程师3分钟内完成表格提取与转换,直接对接自动化测试或大模型。

二、代码实战:三步搞定表格提取

第一步:安装依赖

pip install python-docx

注意:

第二步:核心代码解析

1. 标题检测:精准定位目标段落

def is_heading_enhanced(paragraph):
    # 标题特征:样式名称含关键词 + 字体加粗 + 字体足够大
    style_name = (paragraph.style.name or "").lower()
    if "标题" in style_name or "heading" in style_name:
        return True
    
    try:
        font = paragraph.style.font
        return (font.size.pt >= 14 and font.bold) if font.size else False
    except:
        return False

关键点详解:

样式名称匹配:

格式兜底判断:

异常处理:

使用 try-except 捕获字体信息缺失的异常,避免程序崩溃。

2. 表格抓取:按文档顺序提取

def get_tables_under_heading(doc_path, target_title):
    from docx import Document
    doc = Document(doc_path)
    target_tables = []
    found = False

    for element in doc.element.body.iter():
        if element.tag.endswith('p'):  # 段落
            par = Paragraph(element, doc)
            if target_title in par.text and is_heading_enhanced(par):
                found = True
            elif found and is_heading_enhanced(par):  # 遇到新标题停止
                break
        elif element.tag.endswith('tbl') and found:  # 表格
            table = Table(element, doc)
            data = [[cell.text.strip() for cell in row.cells] for row in table.rows]
            target_tables.append(data)
    
    return target_tables

实战技巧详解:

文档元素遍历:

双重标记机制:

数据提取:

使用列表推导式逐行提取表格内容,cell.text.strip() 去除单元格中的多余空格。

3. 转换Markdown:结构化输出

def to_markdown(table_data):
    if not table_data:
        return ""
    headers = table_data[0]
    md = f"| {' | '.join(headers)} |\n"
    md += f"| {' | '.join(['---']*len(headers))} |\n"
    for row in table_data[1:]:
        md += f"| {' | '.join(row)} |\n"
    return md

效果示例:

| 用户角色 | 创建权限 | 删除权限 | 修改权限 |
|----------|----------|----------|----------|
| 管理员   | 是       | 是       | 是       |
| 普通用户 | 否       | 否       | 是       |

细节说明:

表头与分隔符:第一行数据作为表头,用 --- 分隔表头与数据行。

空表格处理:如果输入表格为空,直接返回空字符串,避免错误。

兼容性:适用于大多数表格,但若表格包含合并单元格,需额外处理(见后续优化建议)。

第三步:调用代码(5分钟上手)

def main():
    doc_path = "需求文档_v2.0.docx"        # 替换为你的文档路径
    target_title = "功能权限矩阵"           # 替换为目标标题
    
    # 提取表格
    tables = get_tables_under_heading(doc_path, target_title)
    
    # 输出Markdown
    for idx, table in enumerate(tables, 1):
        print(f"--- 表格{idx} ---\n")
        print(to_markdown(table))
        print("\n-------------------\n")

if __name__ == "__main__":
    main()

执行步骤:

三、常见问题与解决方案

Q1:检测不到标题

可能原因:

解决方案:

1.检查标题样式:

2.手动调整格式判断:

# 在 is_heading_enhanced 中,降低字体大小要求
return (font.size.pt >= 12 and font.bold) if font.size else False

Q2:表格提取不完整

可能原因:

解决方案:

强制遍历所有表格:

# 移除遇到新标题停止的逻辑
# 删除以下代码:
elif found and is_heading_enhanced(par): break

精确匹配标题:

如果标题文本唯一,可直接使用 par.text.strip() == target_title 完全匹配。

Q3:Markdown格式混乱

可能原因:

单元格内容包含换行符或特殊符号。

解决方案:

清理数据:

# 在提取单元格时去除换行符
cell.text.strip().replace('\n', ' ')

手动调整:

将输出结果复制到Markdown编辑器(如Typora),通过可视化界面调整格式。

四、真实场景应用案例

场景1:生成接口测试用例

# 提取"接口参数表"后,直接生成测试用例模板
table_data = get_tables_under_heading("接口文档.docx", "接口参数表")[0]
for row in table_data[1:]:
    param, type_, example = row
    print(f"测试点:{param}参数为{example}时,接口应返回{type_}类型")

输出示例:

测试点:user_id参数为123时,接口应返回int类型
测试点:username参数为"admin"时,接口应返回str类型

场景2:自动化测试数据生成

# 将表格数据写入CSV文件供测试框架读取
import csv

tables = get_tables_under_heading("测试数据.docx", "登录用例数据")
with open("test_data.csv", "w", newline="") as f:
    writer = csv.writer(f)
    for table in tables:
        writer.writerows(table)

五、代码扩展与优化建议

1. 支持多级标题

def get_tables_under_heading(doc_path, target_title, level=1):
    # 新增参数:level表示标题层级(如1级标题)
    # 在is_heading_enhanced中增加层级判断
    if f"heading{level}" in style_name:
        return True

2. 处理合并单元格

def extract_cell(cell):
    # 处理合并单元格时的空值
    if cell.text.strip():
        return cell.text.strip()
    else:
        return "[合并单元格]"

3. 日志记录与错误提示

import logging
logging.basicConfig(level=logging.INFO)

def main():
    try:
        tables = get_tables_under_heading(...)
    except FileNotFoundError:
        logging.error("文档路径错误,请检查文件是否存在!")

六、总结

通过这套方案,你可以:

立即尝试:

以上就是Python实现快速提取Word表格并转Markdown的详细内容,更多关于Python提取Word转Markdown的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文