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

如何使用python-docx获取项目符号列表的缩进量?

Word文档提取带缩进字符串的问题解决

问题

使用python-docx提取Word文本时,left_indent和first_line_indent仅对无项目符号的普通文本生效,带项目符号的段落缩进无法获取,目标是生成带正确缩进的字符串。

原代码

import docx

def getText(filename):
    doc = docx.Document(filename)
    fullText = []
    for paragraph in doc.paragraphs:
        indent = ''
        if paragraph.paragraph_format.left_indent:
            indent = ' ' * int(round(paragraph.paragraph_format.left_indent / 100000))
        fullText.append(indent + paragraph.text)
    return '\n'.join(fullText)

print(getText(r"file.docx"))

问题原因

带项目符号的段落,其缩进规则由列表样式/列表级别定义,而非段落自身的left_indent属性,所以直接读取段落缩进无法获取正确值。

解决代码

import docx

def getText(filename):
    doc = docx.Document(filename)
    fullText = []
    for paragraph in doc.paragraphs:
        indent = ''
        # 处理列表段落:通过列表级别确定缩进
        if paragraph.list_format.is_list:
            level = paragraph.list_format.level_index
            # 每个列表级别用4个空格模拟缩进,可根据需求调整
            indent = '    ' * (level + 1)
        else:
            # 处理普通段落:转换left_indent为空格
            if paragraph.paragraph_format.left_indent:
                # EMU转空格近似值:1个空格≈6磅,1磅=20缇,1缇=635EMU
                indent_count = int(round(paragraph.paragraph_format.left_indent / (6 * 20 * 635)))
                indent = ' ' * indent_count
        fullText.append(indent + paragraph.text)
    return '\n'.join(fullText)

print(getText(r"file.docx"))

说明

  1. 列表段落通过paragraph.list_format.is_list判断,level_index获取当前列表级别(从0开始),用空格数模拟层级缩进;
  2. 普通段落的left_indent单位是EMU,通过转换公式近似计算对应空格数,可根据实际显示效果调整转换比例;
  3. 该方案兼顾普通段落和列表段落的缩进提取,满足简单提取带格式字符串的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:33:29