Skip to content

Migración desde python-pptx

Office Oxide lee PPTX 46× más rápido que python-pptx (0,7 ms frente a 32,5 ms de media en 806 archivos), con una tasa de éxito 11,7 puntos porcentuales más alta. También lee .ppt heredado directamente — python-pptx no puede.

Cuándo migrar

Cambia si haces alguna de estas cosas:

  • Extraer texto de diapositivas, notas o tablas de .pptx para ingesta / RAG
  • Convertir presentaciones a Markdown o HTML para previsualizaciones
  • Ejecutar plantillas tipo buscar-y-reemplazar (“Q3 → Q4”, “{{quarter}}”, “{{growth}}”)
  • Necesitar soporte de .ppt sin invocar LibreOffice
  • Querer una sola biblioteca que cubra también .docx, .xlsx y formatos heredados

Sigue con python-pptx si:

  • Construyes PPTX complejos desde cero con diseños personalizados, animaciones, transiciones y geometría de formas
  • Necesitas control fino sobre el XML de diseño de las diapositivas

Instalación

pip uninstall python-pptx
pip install office-oxide

Chuleta comparativa

Leer todo el texto de las diapositivas

python-pptx

from pptx import Presentation

prs = Presentation("deck.pptx")
for slide in prs.slides:
    for shape in slide.shapes:
        if shape.has_text_frame:
            for para in shape.text_frame.paragraphs:
                for run in para.runs:
                    print(run.text)

office_oxide

from office_oxide import Document

with Document.open("deck.pptx") as doc:
    text = doc.plain_text()
print(text)

Iterar por diapositiva

python-pptx

prs = Presentation("deck.pptx")
for i, slide in enumerate(prs.slides, 1):
    title = slide.shapes.title.text if slide.shapes.title else "(no title)"
    print(f"slide {i}: {title}")

office_oxide

with Document.open("deck.pptx") as doc:
    ir = doc.to_ir()

for i, section in enumerate(ir["sections"], 1):
    print(f"slide {i}: {section.get('title') or '(no title)'}")

Cada sección del IR corresponde a una diapositiva. section["title"] viene del marcador de título.

Leer tablas en diapositivas

python-pptx

for slide in prs.slides:
    for shape in slide.shapes:
        if shape.has_table:
            for row in shape.table.rows:
                cells = [c.text for c in row.cells]
                print(cells)

office_oxide

with Document.open("deck.pptx") as doc:
    ir = doc.to_ir()

for section in ir["sections"]:
    for el in section["elements"]:
        if el["kind"] == "Table":
            for row in el["rows"]:
                print(row)

Leer notas del presentador

python-pptx

for slide in prs.slides:
    if slide.has_notes_slide:
        print(slide.notes_slide.notes_text_frame.text)

office_oxide

plain_text() y to_markdown() incluyen las notas por defecto — se añaden al final de cada sección de diapositiva. Si necesitas las notas por separado, usa el accesor específico del formato:

with Document.open("deck.pptx") as doc:
    pptx = doc.as_pptx()
    for i, slide in enumerate(pptx.slides(), 1):
        notes = slide.notes()
        if notes:
            print(f"slide {i} notes: {notes}")

Plantillas (buscar y reemplazar)

python-pptx — sin API de primera clase; el patrón habitual es recorrer el marco de texto de cada forma y reescribir. Se rompe fácilmente con coincidencias entre runs.

office_oxide

from office_oxide import EditableDocument

with EditableDocument.open("deck_template.pptx") as ed:
    ed.replace_text("{{quarter}}", "Q4 2026")
    ed.replace_text("{{growth}}",  "+18.4%")
    ed.save("q4_deck.pptx")

replace_text recorre cada <a:t> en todas las diapositivas y notas, y preserva todas las partes OPC no modificadas (imágenes, gráficos, diseños, temas).

Convertir a Markdown / HTML

python-pptx — nada integrado.

office_oxide

with Document.open("deck.pptx") as doc:
    md   = doc.to_markdown()
    html = doc.to_html()

La salida Markdown es una sección ## Slide N por diapositiva, con el contenido del cuerpo y las notas añadidas como citas.

Lectura de .ppt heredado

python-pptx no puede abrir .ppt. Office Oxide las lee directamente:

from office_oxide import Document

with Document.open("legacy.ppt") as doc:
    print(doc.plain_text())
    doc.save_as("modern.pptx")    # migración en una línea

Rendimiento

Biblioteca Media p99 Tasa de éxito
office_oxide 0,7 ms 3,9 ms 98,4 %
python-pptx 32,5 ms 174 ms 86,7 %

Una ingesta de 100.000 presentaciones que tarda 54 minutos con python-pptx se completa en 70 segundos con office_oxide.

Qué se pierde

EditableDocument cubre el caso de plantillas. Para construir PPTX más ricos — añadir diapositivas, diseños personalizados, gráficos, animaciones — baja a office_oxide.pptx::create::PptxBuilder, o quédate en python-pptx para el paso de creación y usa office_oxide para la ingesta.

Ver también