You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python获取Docx文件中多级列表的相对位置?

Python读取Docx多级列表并生成层级化字典

依赖库

首先确保安装python-docx:

pip install python-docx

实现代码

from docx import Document

def extract_multilevel_lists(doc_path):
    doc = Document(doc_path)
    output = {}
    # 维护各层级的计数器,索引对应层级(0为一级,1为二级,以此类推)
    level_counters = []
    # 维护当前层级的编号前缀
    current_prefix = []

    for para in doc.paragraphs:
        # 跳过非列表段落
        if not para.style.name.startswith('List'):
            continue
        
        # 获取当前段落的列表层级(从0开始)
        level_elem = para._element.xpath('./w:pPr/w:numPr/w:ilvl')
        if not level_elem:
            continue
        level = int(level_elem[0].attrib['w:val'])

        # 调整计数器和前缀列表的长度,匹配当前层级
        while len(level_counters) <= level:
            level_counters.append(0)
        while len(current_prefix) <= level:
            current_prefix.append('')
        
        # 回到上层时,重置下层计数器和前缀
        if level < len(level_counters) - 1:
            level_counters = level_counters[:level+1]
            current_prefix = current_prefix[:level+1]
        
        # 递增当前层级计数器
        level_counters[level] += 1

        # 按层级生成对应编号格式
        if level == 0:
            current_num = str(level_counters[level])
            current_prefix[level] = current_num
        elif level == 1:
            # 二级用(a)(b)格式
            current_num = f'({chr(96 + level_counters[level])})'
            current_prefix[level] = f'{current_prefix[level-1]}-{current_num}'
        elif level == 2:
            # 三级用(i)(ii)格式
            roman_map = ['i', 'ii', 'iii', 'iv', 'v', 'vi', 'vii', 'viii', 'ix', 'x']
            current_num = f'({roman_map[level_counters[level]-1]})'
            current_prefix[level] = f'{current_prefix[level-1]}-{current_num}'
        # 可按需扩展更多层级的编号规则

        # 生成最终键并添加文本
        key = current_prefix[level]
        text = para.text.strip()
        if text:
            output[key] = text
    
    return output

# 示例调用
if __name__ == '__main__':
    result = extract_multilevel_lists('your_docx_file.docx')
    for k, v in result.items():
        print(f"{k}: {v}")

关键说明

  • 非列表过滤:通过段落样式前缀判断,直接跳过普通文本段落,只处理列表内容。
  • 层级管理:利用Docx内部的ilvl属性确定列表层级,维护各层级的计数器和前缀,确保层级切换时计数器正确重置。
  • 编号格式:针对一级(阿拉伯数字)、二级(小写字母括号)、三级(罗马数字括号)实现了匹配需求的格式,可根据文档实际列表规则扩展更多层级。
  • 文本清理:自动去除段落前后的冗余空格,避免无效空内容加入结果。

注意事项

部分Docx文档的列表样式可能命名差异(比如包含Bullet或Numbering),如果过滤不彻底,可调整para.style.name的判断逻辑;罗马数字部分当前仅支持前10个,若需要更多可扩展罗马数字生成逻辑。

内容的提问来源于stack exchange,提问作者crx91

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:32:56