как удалить жирные слова из Python Docx - PullRequest
0 голосов
/ 28 июня 2018

У меня есть документ, который мне нужно предварительно обработать с помощью spaCy. Мне нужно удалить все слова, которые выделены жирным шрифтом в документе.

Я попробовал следующее:

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?

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 28 июня 2018

Есть несколько вероятных причин:

  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
    
...