Найти слово в нескольких файлах PowerPoint Python - PullRequest
0 голосов
/ 03 апреля 2019

У меня много pptx-файлов для поиска в каталоге, и я ищу в этих файлах конкретное слово "data" .Я создал приведенный ниже код, который читает все файлы, но не дает правильного результата true или false .Например, в Person1.pptx слово «данные» существует в двух «формах» .Вопрос в том, где именно ошибка, и почему код имеет неправильные результаты.

from pptx import Presentation
import os
files = [x for x in os.listdir("C:/Users/../Desktop/Test") if x.endswith(".pptx")]
for eachfile in files:
    prs = Presentation("C:/Users/.../Desktop/Test/" + eachfile)
    print(eachfile)
    print("----------------------")
    for slide in prs.slides:
        for shape in slide.shapes:
            print ("Exist? " + str(hasattr(shape, 'data')))

Результат такой, как показано ниже

Person1.pptx
----------------------
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False
Person2.pptx
----------------------
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False
Exist? False

И ожидаемый результат можно найти в одном изслайды слово «данные» и печатать правда.На самом деле ожидаемый результат будет:

Person1.pptx
----------------------
Exist? True

Person1.pptx
----------------------
Exist? False

True, если в любой из фигур на каждом слайде слово существует, и false, если во всех формах слайда слово не существует.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

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

Проблема в том, что игнорируется наличие ряда структур для анализа.Выше код разбирает только некоторые из них (фигуры с текстом непосредственно в себе).Наиболее важной структурой, которую также необходимо проанализировать, чтобы найти все фигуры с требуемым текстом, является группа.Это фигура, которая сама по себе может не содержать текст, но может содержать фигуры, содержащие текст.

Кроме того, форма этой группы или ее формы могут, в свою очередь, содержать другие группы.Это привело нас к необходимости итеративной стратегии поиска.Таким образом, при анализе форм на каждом слайде необходим другой подход.Это лучше всего продемонстрировать повторным использованием приведенного выше кода с сохранением первой части:

from pptx import Presentation
import os

files = [x for x in os.listdir("C:/Users/.../Desktop/Test") if x.endswith(".pptx")] 

for eachfile in files:
    prs = Presentation("C:/Users/.../Desktop/Test/" + eachfile) 
    for slide in prs.slides:

, затем нам нужно заменить тест "hasattr" вызовом для рекурсивной части:

        checkrecursivelyfortext(slide.shapes)

а также вставить новое определение функции для рекурсивной функции (как после оператора import).Чтобы упростить сравнение, вставленная функция использует тот же код, что и выше, добавляя только рекурсивную часть:

def checkrecursivelyfortext(shpthissetofshapes):
    for shape in shpthissetofshapes:
        if shape.shape_type == MSO_SHAPE_TYPE.GROUP:
            checkrecursivelyfortext(shape.shapes)
        else:
            if hasattr(shape, "text"):
                shape.text = shape.text.lower()
                if "whatever_you_are_looking_for" in shape.text:
                    print(eachfile)
                    print("----------------------")
                    break

Чтобы работать точно так, как нужно, разрыв должен обрабатываться по-разному (разрыв всех текущих циклов),Это немного усложнит код и упустит акцент на разборе групп, поэтому здесь игнорируется.

0 голосов
/ 10 апреля 2019

Я нашел это сам.:)

from pptx import Presentation
import os

files = [x for x in os.listdir("C:/Users/.../Desktop/Test") if x.endswith(".pptx")] 

for eachfile in files:
    prs = Presentation("C:/Users/.../Desktop/Test/" + eachfile) 
    for slide in prs.slides:
        for shape in slide.shapes:
            if hasattr(shape, "text"):
                shape.text = shape.text.lower()
                if "whatever_you_are_looking_for" in shape.text:
                    print(eachfile)
                    print("----------------------")
                    break
...