2

我有一个需要使用 spaCy 预处理的 docx。我需要删除文档中以粗体显示的所有单词。

我尝试了以下方法:

def delete_paragraph(paragraph):
p = paragraph._element
p.getparent().remove(p)
p._p = p._element = None


length = len(document.paragraphs)
for i in range(0,length):
  for j in range(0,len(document.paragraphs[i].runs)):
     if document.paragraphs[i].runs[j].bold == True:
        delete_paragraph(document.paragraphs[i])
        length = length-1
        continue
document.save("/home/nikita/Desktop/Internship/new topic_mod/AXIS new.docx")

但我收到以下错误:

IndexError: Traceback (most recent call last)
<ipython-input-12-d144bd42e95e> in <module>()
  3     #print(document.paragraphs[i].text)
  4     for j in range(0,len(document.paragraphs[i].runs)):
----> 5         if document.paragraphs[i].runs[j].bold == True:
  6             delete_paragraph(document.paragraphs[i])
  7             length = length-1

IndexError: list index out of range

我无法弄清楚为什么它超出范围。如何从 python-docx 中删除粗体字?

请帮忙!

4

1 回答 1

0

有几个可能的原因:

  1. 一旦你删除了段落,你需要打破(不是continue)你的内部循环,否则如果它有多个粗体运行,你会尝试多次删除同一个段落。

    for j in range(0,len(document.paragraphs[i].runs)):
        if document.paragraphs[i].runs[j].bold == True:
            delete_paragraph(document.paragraphs[i])
            length = length-1
            break
    
  2. 每次删除一个段落时,您的段落列表都会变短,这会更改后面每个段落的索引。如果您从下到上遍历段落,那将不成问题。此外,您可以放弃所有 (i, j) 索引管理;Python 很少需要它。

    for paragraph in reversed(list(document.paragraphs)):
        for run in paragraph.runs:
            if run.bold:
                delete_paragraph(paragraph)
                break
    
于 2018-06-28T18:19:07.597 回答