Миграция с python-pptx
Office Oxide читает PPTX в 46 раз быстрее python-pptx (0,7 мс против 32,5 мс в среднем на 806 файлах) и имеет на 11,7 процентного пункта более высокую долю успешного разбора. Он также читает устаревший .ppt напрямую — python-pptx этого не умеет.
Когда мигрировать
Переходите, если вы делаете что-либо из этого:
- Извлекаете текст слайдов, заметки или таблицы из
.pptxдля ingestion / RAG - Конвертируете презентации в Markdown или HTML для предпросмотров
- Делаете шаблонизацию поиск-и-замена (“Q3 → Q4”, “{{quarter}}”, “{{growth}}”)
- Нужна поддержка
.pptбез запуска LibreOffice - Хотите одну библиотеку, которая покрывает и
.docx, и.xlsx, и устаревшие форматы
Останьтесь на python-pptx, если:
- Вы собираете сложные PPTX с нуля — с кастомными макетами, анимациями, переходами и геометрией фигур
- Нужен тонкий контроль над XML макетов слайдов
Установка
pip uninstall python-pptx
pip install office-oxide
Сравнительная шпаргалка
Прочитать весь текст слайдов
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)
Итерация по слайдам
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)'}")
Каждая секция IR соответствует одному слайду. section["title"] берётся из заголовочного плейсхолдера.
Чтение таблиц на слайдах
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)
Чтение заметок докладчика
python-pptx
for slide in prs.slides:
if slide.has_notes_slide:
print(slide.notes_slide.notes_text_frame.text)
office_oxide
plain_text() и to_markdown() по умолчанию включают заметки — они дописываются в конец секции каждого слайда. Если нужны заметки отдельно, используйте формат-специфичный аксессор:
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}")
Шаблонизация (поиск и замена)
python-pptx — нет первоклассного API; типовой подход — обходить текстовые фреймы каждой фигуры и переписывать текст. Легко ломается на меж-run совпадениях.
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 обходит каждый <a:t> на всех слайдах и слайдах заметок и сохраняет все неизменённые OPC-части (картинки, графики, макеты, темы).
Конвертация в Markdown / HTML
python-pptx — ничего встроенного.
office_oxide
with Document.open("deck.pptx") as doc:
md = doc.to_markdown()
html = doc.to_html()
На выходе Markdown — одна секция ## Slide N на слайд, с телом и заметками, дописанными как цитаты.
Чтение устаревшего .ppt
python-pptx не умеет открывать .ppt. Office Oxide читает их напрямую:
from office_oxide import Document
with Document.open("legacy.ppt") as doc:
print(doc.plain_text())
doc.save_as("modern.pptx") # миграция в одну строку
Производительность
| Библиотека | Среднее | p99 | Доля успеха |
|---|---|---|---|
| office_oxide | 0,7 мс | 3,9 мс | 98,4% |
| python-pptx | 32,5 мс | 174 мс | 86,7% |
Инжест 100 000 презентаций, который на python-pptx занимает 54 минуты, на office_oxide завершается за 70 секунд.
Что теряется
EditableDocument покрывает шаблонный сценарий. Для более богатой сборки PPTX — добавления слайдов, кастомных макетов, графиков, анимаций — спускайтесь в office_oxide.pptx::create::PptxBuilder либо оставайтесь на python-pptx для шага создания и используйте office_oxide для инжеста.
См. также
- Замена текста — семантика
replace_textи работа с границами run - Office для RAG — разбиение с учётом слайдов
- Бенчмарки производительности