Метаданные Excel файлов

Не так давно передо мной стала задача проанализировать количество 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.


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

  • +12
  • 4,2k
  • 6
Поделиться публикацией

Комментарии 6

    0
    Все заработало, метаданные корректно извлекались. Но. В терминале. Мне же нужен был скрипт с циклом.

    Дурацкий вопрос: в питоне разве нельзя запустить внешнюю утилиту и получить выведенный ей текст в строку? В перле это делается двумя обратными кавычками: $txt = `utility args`;. Да и на шелле похожая конструкция есть (sh, bash, ksh, csh, zsh — точно есть, в остальных не работал).
      0
      Можно, используя subprocess.check_output(..)
      0
      А можно полюбопытствовать: почему источником выбрали метаданные Excel файлов, а не даты создания или изменения файла?
        0
        Потому что даты изменения и создания слишком непредсказуемы и не дают достоверной информации о первом создании и реальном изменении файла. Они могут измениться при любом чихе файловой системы, особенно при копировании или просто чтении.
        +1

        В качестве альтернативы, такая задача (сбор внутренних данных Excel) на VBA решается достаточно тривиально.


        Плюсы:


        • проще код
        • универсальный код и решение для xls и xlsx
        • можно наформошлепить простой UI (если нужно)

        Минусы:


        • медленнее работа самой программы (вероятно)
        • работа в 1 поток

        Так, я, например, зная VBA и Python, осознанно делал инспектор файлов Excel на наличие скрытых листов именно на VBA.

          +1
          На PyPI есть еще несколько десятков тысяч пакетов. На каждый пакет можно написать статью, как пользоваться этим пакетом. Вроде бы здорово, но вот зачем?

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое