Как вытащить текст из любого файла и не сойти с ума
Знакомая история: вам нужно проиндексировать кучу документов для поиска или скормить их нейронке. Сначала кажется, что всё просто, но потом выясняется, что в папке лежат PDF, старые вордовские документы .doc, таблицы Excel и даже пара странных писем в формате .eml. Писать обёртку для каждой библиотеки — сомнительное удовольствие. Я недавно наткнулся на библиотеку textract, которая пытается закрыть этот вопрос раз и навсегда.
В чём соль проекта
Textract — это такая библиотека-швейцарский нож для Python. Её главная фишка в том, что ей абсолютно всё равно, какой формат документа вы ей подсунете. Она сама под капотом определит тип файла и выберет нужный парсер. Разработчикам не нужно думать, подключать ли PyPDF2, python-docx или искать что-то для обработки аудио (да, она и это умеет).
Проект живёт под лозунгом «No muss. No fuss», что на наш манер означает «Без шума и пыли». И это действительно так: вместо того чтобы изучать специфику пяти разных библиотек, вы используете один метод process.
Какие форматы она переваривает
Список поддерживаемых расширений внушает уважение. Вот лишь часть того, что Textract щёлкает как орешки:
- Офисные документы: .docx, .xlsx, .pptx и даже древние .doc.
- Текстовые и разметочные форматы: .csv, .json, .html, .md.
- Картинки и сканы: .jpg, .png (через OCR).
- Специфические вещи: .eml, .msg, .rtf и даже аудиофайлы вроде .mp3 или .wav.
Кстати, для работы с изображениями и PDF со сканами библиотека умеет дергать Tesseract OCR. Это значит, что если в PDF нет текстового слоя, Textract не выкинет пустую строку, а попытается распознать символы на картинке.
Как это выглядит в коде
Пожалуй, это самая приятная часть. Весь процесс сводится к паре строк. Допустим, у нас есть файл resume.pdf.
import textract
text = textract.process("path/to/resume.pdf")
print(text.decode('utf-8'))
Если нужно передать специфические параметры (например, указать язык для распознавания текста), это делается через именованные аргументы:
text = textract.process('scan.jpg', method='tesseract', language='rus')
Интересно, что библиотеку можно использовать и как CLI-утилиту. Иногда это быстрее, чем писать скрипт, если нужно просто глянуть содержимое файла в терминале:
textract document.docx
Техническая внутрянка и нюансы
Textract не пытается переписать все парсеры с нуля. Она выступает в роли умного диспетчера. Для каждого расширения в ней прописан соответствующий бэкенд. Например, для PDF используется pdftotext, а для .doc файлов — antiword.
Здесь кроется и главный нюанс: зависимости. Сама библиотека ставится через pip install textract, но многие системные утилиты (вроде того же antiword или swig) нужно устанавливать отдельно через пакетный менеджер вашей ОС (apt-get или brew). README проекта довольно подробно описывает, что именно понадобится для поддержки конкретных форматов. В моей практике настройка окружения заняла чуть больше времени, чем написание самого кода, но это разовая акция.
Где это пригодится
Я вижу несколько сценариев, где Textract сэкономит кучу нервов:
- Системы электронного документооборота. Когда пользователи грузят что попало, а вам нужно делать по этому поиск.
- Анализ данных и NLP. Если вы собираете датасет из разных источников.
- Автоматизация офисной рутины. Например, когда нужно быстро вытащить данные из сотен старых отчётов в разных форматах.
Стоит ли пробовать
Если в вашем проекте обработка документов — это вспомогательная задача, и вы не хотите тратить недели на изучение спецификаций бинарных форматов, Textract — отличный выбор. Проект стабильный, у него около 4.5 тысяч звёзд на GitHub, что для такой узкой ниши очень прилично.
Конечно, если вам нужна хирургическая точность извлечения метаданных или сохранение сложной разметки таблиц в PDF, возможно, придётся брать что-то более специализированное. Но для быстрого извлечения «голого» текста ничего проще я пока не встречал. Попробовать стоит хотя бы для того, чтобы увидеть, как зоопарк форматов превращается в одну понятную строку.
