[Из песочницы] Метаданные Excel файлов

habr.png

Не так давно передо мной стала задача проанализировать количество Excel файлов созданных за определенный месяц года. Не буду вдаваться в подробности, скажу вкратце: для оценки работы сотрудников одной фирмы. Файлов в наличии было около тысячи и суть задачи сводилась к тому, чтобы сделать понятный график в виде гистограммы для руководителя
фирмы, в какой месяц года и сколько было сделано файлов (это были товарные накладные).
Я посчитал, что неплохо было бы для этой цели использовать метаданные файлов, т.е. прогнать имеющиеся файлы по циклу, извлечь даты создания файлов и загрузить это все в виде списка в Matplotlib для создания гистограммы.

Никогда не работал с метаданными до этого времени, хотя периодически возникала необходимость, но обходился другими средствами, поэтому опыта не было. И вот в очередное утро, наделав бутербродов и наведя литровую чашку кофе, приступил к реализации своей идеи.

«Приступил» конечно сильно сказано. Перво-наперво это естественно поиск в интернете информации о метаданных, о работе с ними в Python, похожих проектов и т.д. Почти сразу же наткнулся на модуль oletools для Python, он есть и на GitHub, и в PyPi, есть неплохая документация. Изучал я ее пару часов. Установил oletools. Все заработало, метаданные корректно извлекались. Но. В терминале. Мне же нужен был скрипт с циклом. Где только я в интернете не искал как «подружить» oletools и IDLE, дошел до 15(!) страницы в поисковике. Информации ноль.

Я уверен, вне всяких сомнений, что это замечательный модуль, наверняка очень мощный, но никак он мне не дался. В очередной попытке (уже к вечеру) заставить скрипт хоть как то извлекать метаданные файла, поднялось очередное исключение. И вот тут я обратил внимание что oletools для работы загружает модуль olefile. Набрал в поисковике и каково же было мое удивление когда я обнаружил что это именно то что я весь день искал. Очень понятная документация. Прочел за полчаса и сразу же по ходу чтения набросал скрипт.

Сначала установка olefile в системе:
pip3 install --user olefile

А вот и сам скрипт, извлекающий метаданные из Excel файла (мне понадобилось только значение meta.last_saved_time):

import olefile
File_Ole='File.xls'
assert olefile.isOleFile(File_Ole) # Проверка корректности OLE файла
ole = olefile.OleFileIO(File_Ole)
meta = ole.get_metadata() # Извлечение метаданных
print('Дата создания файла:  '+str(meta.create_time)) # Вывод даты создания файла
print('Дата последнего сохранения:  '+str(meta.last_saved_time))# Вывод даты сохранения файла
meta.dump() # Вывод всех метаданных на экран
ole.close() # Закрытие файла

Не буду приводить здесь весь код своего скрипта, моей задачей в этом посте было рассказать о простом и быстром извлечении метаданных из Excel файла с помощью модуля olefile. Кстати этот модуль извлекает метаданные из множества форматов файлов, подробнее можно ознакомиться в документации.

Справедливости ради стоит заметить также что olefile извлекает метаданные только из файлов Excel 1997–2003, т.е. с расширением .xls. Для файлов .xlsx я писал конвертер с модулем pyexcel.

Ну вот и все. Спасибо за внимание, надеюсь мой пост поможет кому-нибудь сэкономить время, нервы и, самое главное, сохранить хорошее настроение.

© Habrahabr.ru