Разделение docx по заголовкам на отдельные файлы в Python - PullRequest
0 голосов
/ 28 января 2019

Я хочу написать программу, которая захватывает мои файлы docx, просматривает их и разбивает каждый файл на несколько отдельных файлов на основе заголовков.Внутри каждого документа есть пара статей, каждая с заголовком 1 и текстом под ним.

Так что, если в моем исходном файле file1.docx есть 4 статьи, я хочу, чтобы он был разбит на 4 отдельных файла с заголовком и текстом.файлов по пути, где я храню файлы .docx, и я могу читать заголовки и текст отдельно, но я не могу найти способ объединить все это и разделить его на отдельные файлы, каждый с заголовкоми текст.Я использую библиотеку python-docx.

import glob
from docx import Document

headings = []
texts = []

def iter_headings(paragraphs):
    for paragraph in paragraphs:
        if paragraph.style.name.startswith('Heading'):
            yield paragraph

def iter_text(paragraphs):
    for paragraph in paragraphs:
        if paragraph.style.name.startswith('Normal'):
            yield paragraph

for name in glob.glob('/*.docx'):
    document = Document(name)
    for heading in iter_headings(document.paragraphs):
        headings.append(heading.text)
        for paragraph in iter_text(document.paragraphs):
            texts.append(paragraph.text)
    print(texts)

Как извлечь текст и заголовок для каждой статьи?

Это чтение XML, которое дает мне python-docx.Красные скобки отмечают то, что я хочу извлечь из каждого файла.

https://user -images.githubusercontent.com / 17858776 / 51575980-4dcd0200-1eac-11e9-95a8-f643f87b1f40.png

Я открыт для любых альтернативных предложений о том, как добиться того, что я хочу, с помощью различных методов, или если есть более простой способ сделать это с помощью файлов PDF.

1 Ответ

0 голосов
/ 30 января 2019

Я думаю, что подход с использованием итераторов является разумным, но я был бы склонен разделять их по-другому.На верхнем уровне вы можете иметь:

for paragraphs in iterate_document_sections(document.paragraphs):
    create_document_from_paragraphs(paragraphs)

Тогда iterate_document_sections() будет выглядеть примерно так:

def iterate_document_sections(document):
    """Generate a sequence of paragraphs for each headed section in document.

    Each generated sequence has a heading paragraph in its first position, 
    followed by one or more body paragraphs.
    """
    paragraphs = [document.paragraphs[0]]
    for paragraph in document.paragraphs[1:]:
        if is_heading(paragraph):
             yield paragraphs
             paragraphs = [paragraph]
             continue
        paragraphs.append(paragraph)
    yield paragraphs

Нечто подобное в сочетании с частями вашего другого кода должно дать вам что-то работоспособноеначать с.Вам понадобится реализация is_heading() и create_document_from_paragraphs().

. Обратите внимание, что термин «раздел» здесь используется, как и в общепринятом языке публикации, для обозначения заголовка (раздела) и его подчиненных абзацев, ине ссылается на объект раздела документа Word (например, document.sections).

...