如何使用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
相关产品推荐
相关产品推荐

