Ответ на этот вопрос, поскольку приведенный выше ответ может ввести в заблуждение больше, чем я.Это не завершено.Это не так.Но во многих реальных случаях это приведет к неверному результату.
Проблема в том, что игнорируется наличие ряда структур для анализа.Выше код разбирает только некоторые из них (фигуры с текстом непосредственно в себе).Наиболее важной структурой, которую также необходимо проанализировать, чтобы найти все фигуры с требуемым текстом, является группа.Это фигура, которая сама по себе может не содержать текст, но может содержать фигуры, содержащие текст.
Кроме того, форма этой группы или ее формы могут, в свою очередь, содержать другие группы.Это привело нас к необходимости итеративной стратегии поиска.Таким образом, при анализе форм на каждом слайде необходим другой подход.Это лучше всего продемонстрировать повторным использованием приведенного выше кода с сохранением первой части:
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
Чтобы работать точно так, как нужно, разрыв должен обрабатываться по-разному (разрыв всех текущих циклов),Это немного усложнит код и упустит акцент на разборе групп, поэтому здесь игнорируется.