python-docx как выбрать определённый кусок текста из файла docx и сохранить его в новом документе?

Рейтинг: 1Ответов: 1Опубликовано: 05.06.2023

Как в python-docx выбрать определённый кусок текста из файла docx и сохранить его в новом документе docx? Куски текста должны выбираться по заголовку например "Подавал". Выбранный текст должен быть до следующего заголовка "Кровля"[пример того, какой текст надо выбрать в скрине]. Если python-docx это не сделать, то посоветуйте другую библиотеку, формат исходных файлов не принципиален docx или txt или pdf без разницы.

Ответы

▲ 0

Так как нет информации о том, какую информацию точно надо искать, и насколько вариативны ваши доки, могу предложить 2 варианта, которые приходят в голову:

  • Вариант "И так сойдет":

используете docx2txt, делаете просто дамп текста, и в этом дампе ищете нужные вам заголовки (последствия: не известно, где в тексте еще встречаются нужные вам слова).

Тут вам нужно понимать, что обычный текст в ooxml-доках состоит из абзацев (paragraph), которые состоят из "последовательностей" (run). Помимо абзацев, в доках могут быть таблицы, формы, и дофига еще чего.

Мы идем по документу, ищем интересующее нас начало, и ждем интересующий нас конец:

from docx import Document

collected_text = []
start_text = 'Наше начало'
end_text = 'Наш конец'

doc = Document('demo.docx')
collect = False
for par in doc.paragraphs:
    # обратите внимание: paragraph.text сливает несколько run-ов в один
    # если вы хотите больше контроля, идите глубже по paragraph.runs
    current_text = par.text 
    if current_text.startswith(start_text): # если заголовок хотите полностью - используйте обычный ==
        collect = True
    elif current_text.startswith(end_text):
        break
    if collect:
        collected_text.append(current_text)

Это минимальная версия, когда у нас в документе есть только текст и мы уверены, что повторений заголовков не будет больше нигде в документе. Эти и другие подводные камни надо как-то обходить, я дал начальный пример по вашему запросу.