Skip to content

Migration von python-pptx

Office Oxide liest PPTX 46× schneller als python-pptx (0,7 ms gegenüber 32,5 ms Mittelwert über 806 Dateien), mit einer um 11,7 Prozentpunkte höheren Erfolgsquote. Legacy-.ppt liest es direkt — python-pptx kann das nicht.

Wann migrieren

Wechseln Sie, wenn Sie eines dieser Dinge tun:

  • Slide-Text, Notizen oder Tabellen aus .pptx für Ingest / RAG extrahieren
  • Decks zu Markdown oder HTML für Previews konvertieren
  • Find-and-Replace-Templating ausführen (“Q3 → Q4”, “{{quarter}}”, “{{growth}}”)
  • .ppt-Support brauchen, ohne LibreOffice aufzurufen
  • Eine Bibliothek wollen, die auch .docx, .xlsx und Legacy-Formate abdeckt

Bleiben Sie bei python-pptx, wenn:

  • Sie komplexe PPTX von Grund auf bauen — mit Custom-Layouts, Animationen, Übergängen und Shape-Geometrie
  • Sie feingranulare Kontrolle über das Slide-Layout-XML brauchen

Installation

pip uninstall python-pptx
pip install office-oxide

Spickzettel im Direktvergleich

Gesamten Slide-Text lesen

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)

Slide-weise iterieren

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)'}")

Jede IR-Section entspricht einem Slide. section["title"] kommt aus dem Title-Placeholder.

Tabellen auf Slides lesen

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)

Sprechernotizen lesen

python-pptx

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

office_oxide

plain_text() und to_markdown() enthalten Notizen standardmäßig — sie werden am Ende der jeweiligen Slide-Section angehängt. Wenn Sie Notizen separat brauchen, nutzen Sie den formatspezifischen Accessor:

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}")

Templating (Find-and-Replace)

python-pptx — kein erstklassiges API; gängiges Muster ist, den Textrahmen jeder Shape zu durchlaufen und zu überschreiben. Bricht leicht bei Run-übergreifenden Treffern.

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 durchläuft jedes <a:t> auf allen Slides und Notes-Slides und erhält alle unveränderten OPC-Teile (Bilder, Charts, Layouts, Themes).

Konvertierung zu Markdown / HTML

python-pptx — nichts eingebaut.

office_oxide

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

Die Markdown-Ausgabe besteht aus einem ## Slide N-Abschnitt pro Slide, mit Body-Inhalt und Notizen als Blockquotes angehängt.

Legacy-.ppt lesen

python-pptx kann .ppt nicht öffnen. Office Oxide liest sie direkt:

from office_oxide import Document

with Document.open("legacy.ppt") as doc:
    print(doc.plain_text())
    doc.save_as("modern.pptx")    # Einzeiler-Migration

Performance

Bibliothek Mittel p99 Erfolgsquote
office_oxide 0,7 ms 3,9 ms 98,4 %
python-pptx 32,5 ms 174 ms 86,7 %

Ein Ingest von 100 000 Decks, der mit python-pptx 54 Minuten dauert, läuft mit office_oxide in 70 Sekunden durch.

Was verloren geht

EditableDocument deckt den Templating-Anwendungsfall ab. Für reichhaltigere PPTX-Konstruktion — Slides hinzufügen, Custom-Layouts, Charts, Animationen — steigen Sie in office_oxide.pptx::create::PptxBuilder ab oder bleiben für den Creation-Schritt bei python-pptx und nutzen office_oxide für den Ingest.

Siehe auch