Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

python3. Как открыть(получить данные) офисные документы (doc,odt, etc…)

#python_3x #парсер #open_office


Подскажите, как в python3  открыть и получить данные из офисных файлов, таких как
odt, doc, docx, rtf. Хотя бы odt.

То что odt  и docx  это по сути архивы в курсе, можно их по идее распаковать, и посмотреть
на файл content.xml (если не ошибаюсь), но может есть более современные или удобные
способы.

Все что нашел, это для создания таблиц  ods. 

Нашел модули uno, pyoo  и везде описано как создать таблицы, а как получить данные
из офисных документов не нашел.

Задача пробежаться по всем существующим в каталоге(подкаталогах) файлах, найти или
проанализировать нужное и вывести результат в отдельный файл.

Сейчас подобное частично реализовано на bash'e, хочу переписать все на python3.

Подскажите или покажите как искать.
    


Ответы

Ответ 1



Ну вот навскидку пара библиотек: https://pypi.python.org/pypi/ezodf https://github.com/eea/odfpy Конечно работать через сервисы OpenOffice - более правильный путь самурая, но для этого нужен хотя бы "безголовый" OpenOffice, а его может не оказаться. Кроме того, мне кажется, сервисы OpenOffice будут разочаровывать показателями производительности при обработке большого количества файлов, но вы получите полный функционал. Кстати нужно учитывать что при использовании OpenOffice придется руководствоваться документацией по Java API и адаптировать ее под Python

Ответ 2



Оформлю как ответ, чтоб в комментариях не рыскать, если tutankhamun не против, если против, то в свой ответ добавьте и я свой удалю. И так, вопрос получилось решить с помощью модуля ezodf ( не много документации его ). При установке будьте внимательны, если у вас и 2 и 3 версии python, для третьей я ставил так python3 setup.py install. Небольшой пример кода, для наглядности import ezodf odt = ezodf.opendoc('/home/user/python/text.odt') list=[] # Запускаем цикл for и перебираем все что нашли в файле) for i in odt.body: if i.text == None: print('no') else: list.extend(re.findall(r"[\w']+", i.text.lower())) Поясню, использовал i.text заместо i.plaintext(), для ловли нескольких строк со значением None (видимо какие то служебные данные, не разбирался), просто plaintext() добавляет пустые элементы в список и мне на тот момент показалось,Что через text будет быстрее, но утром могу переосмыслить) а тут list.extend(re.findall(r"[\w']+", i.text.lower())) - с существующему списку list присоединяю или даже так, этим расширяя существующий список list. Выбираю все слова регулярным выражением (каждое слово из документа в список), применяю к ним нижний регистр и все. так это только кусок, потому может смотреться не очень, и многое что можно добавить, но по крайней мере теперь понятно как читать документы. Спасибо tutankhamun за подсказки.

Комментариев нет:

Отправить комментарий