Получаем метаданные с помощью Python.
Привет хацкер, сегодня будем писать скрипт для получения метаданных из картинок фото. Метаданные — данные о самих данных. Сегодня мы научимся их доставать.
Метаданные — информация о другой информации, или данные, относящиеся к дополнительной информации о содержимом или объекте. Метаданные раскрывают сведения о признаках и свойствах, характеризующих какие-либо сущности, позволяющие автоматически искать и управлять ими в больших информационных потоках.
Для написания нам понадобится библиотека Pillow и argparse.
# Coded by Dark $ide —- http://tele.click/darkside_team #!/usr/bin/python3.6 #тут указывайте свой путь к python # -*- coding: utf-8 -*- #кодировка
#импортируем необходимые модули
import argparse from PIL import Image from PIL.ExifTags import TAGS
#функция ниже получает на вход имя файла(картинки) и имя файла(для вывода информации)
def getMetaData(imgname, out):
#получаем словарь из метаданных картинки и выводим его в терминал, #если не указано имя файла для вывода информации.
try: metaData = <> imgFile = Image.open(imgname) print("Getting meta data. ") info = imgFile._getexif() if info: print("Found meta data!") #перебор данных в словаре с метаданными for (tag, value) in info.items(): tagname = TAGS.get(tag, tag) metaData[tagname] = value if not out: print(tagname, value) #если указано имя файла то выводим в файл if out: print("Outputting to file. ") with open(out, 'w') as f: for (tagname, value) in metaData.items(): f.write(str(tagname)+"\t"+str(value)+"\n") #если произошла ошибка выводим сообщение о ней except: print("Failed") #функция main(). Парсим в ней аргументы командной строки. def main(): parser = argparse.ArgumentParser() parser.add_argument("img", help="name of img file.") parser.add_argument("-o", "--output", help="dump data out to file") args = parser.parse_args() if args.img: getMetaData(args.img, args.output) else: print(parser.usage) #точка входа if __name__ == '__main__': main()
Пример вывода нашего скрипта:
Как с помощью Python извлечь метаданные изображения
Узнайте, как можно извлекать метаданные изображения, такие как информация GPS, марка камеры, модель и многое другое, с помощью Exchangeable Image File Format (EXIF) в Python с библиотекой Pillow.
В этой небольшой записке я покажу, как извлечь некоторые полезные метаданные из изображений с помощью библиотеки Pillow в Python.
Такие устройства, как цифровые камеры, смартфоны и сканеры, используют стандарт EXIF એ для сохранения изображений или аудиофайлов. Этот стандарт содержит множество полезных тегов для извлечения, которые могут быть полезны для судебных расследований. например, марка, модель устройства, точная дата и время создания изображения и даже информация GPS на некоторых устройствах.
Обратите внимание, что есть абсолютно бесплатные инструменты для извлечения метаданных, такие как ImageMagick или ExifTool в Linux , моя цель — получить метаданные с помощью языка программирования Python.
Для начала вам необходимо установить библиотеку Pillow:
pip3 install Pillow
Откройте новый файл Python и запишите:
from PIL import Image from PIL.ExifTags import TAGS
Теперь это будет работать только с файлами изображений JPEG એ , найдите в своих закромах любое изображение и пощупайте его, используя материалы этой записки (если вы хотите протестировать мое изображение, вы найдете его в репозитории учебника):
# путь к изображению или видео imagename = "image.jpg" # читать данные изображения с помощью PIL image = Image.open(imagename)
После чтения изображения с помощью функции Image.open() вызовем метод getexif() для изображения, которая возвращает метаданные изображения:
# извлечь данные EXIF exifdata = image.getexif()
Проблема с переменной exifdata заключается в том, что имена полей — это просто идентификаторы, а не удобочитаемое имена, поэтому нам понадобится словарь TAGS из модуля PIL.ExifTags, который отображает каждый идентификатор в человеческий текст:
# iterating over all EXIF data fields for tag_id in exifdata: # получить имя тега вместо идентификатора tag = TAGS.get(tag_id, tag_id) data = exifdata.get(tag_id) # декодировать байты if isinstance(data, bytes): data = data.decode() print(f": ")
Вот какая у меня получилось утилитка, для которой в командной строке надо задавать имя файла:
from PIL import Image from PIL.ExifTags import TAGS import sys # путь к изображению или видео imagename = sys.argv[1] # читать данные изображения с помощью PIL image = Image.open(imagename) # извлечь данные EXIF exifdata = image.getexif() # перебор всех полей данных EXIF for tag_id in exifdata: # получить имя тега вместо нечитаемого идентификатора tag = TAGS.get(tag_id, tag_id) data = exifdata.get(tag_id) # декодировать байты if isinstance(data, bytes): data = data.decode() print(f":% ")
ImageWidth :% 5312 ImageLength :% 2988 ResolutionUnit :% 2 ExifOffset :% 226 Make :% samsung Model :% SM-G920F Software :% G920FXXS4DPI4 Orientation :% 1 DateTime :% 2016:11:10 19:33:22 YCbCrPositioning :% 1 XResolution :% 72.0 YResolution :% 72.0
Куча полезных вещей, быстро погуглив Модель, я пришел к выводу, что это изображение было снято Samsung Galaxy S6. Запустите скрипт для изображений, снятых другими камерами, и вы увидите другие поля, возможно их будет больше.
Для утренней разминки достаточно, хватит. Для вас интересная задача — с интересного вам URL-адреса загрузите все изображения, а затем запустить описанный сценарий для каждого из полученных, изучите результаты!
Как с помощью Python извлечь метаданные изображения , опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.
Респект и уважуха
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Ограничение ответственности
Информация на сайте предоставляется «как есть», без всяких гарантий, включая гарантию применимости в определенных целях, коммерческой пригодности и т.п. В текстах могут быть технические неточности и ошибки. Автор не может гарантировать полноты, достоверности и актуальности всей информации, не несет ответственности за последствия использования сайта третьими лицами. Автор не делает никаких заявлений, не дает никаких гарантий и оценок относительно того, что результаты, размещенные на сайте и описанные в заявлениях относительно будущих результатов, будут достигнуты. Автор не несет ответственности за убытки, возникшие у пользователей или третьих лиц в результате использования ими сайта, включая упущенную выгоду. Автор не несет ответственности за убытки, возникшие в результате действий пользователей, явно не соответствующих обычным правилам работы с информацией в сети Интернет. Пользуясь сайтом, вы принимаете и соглашаетесь со всеми нашими правилами, включая «Ограничение ответственности».
Рекомендую
Link’s QR code
Время, где сейчас
До восхода не будить и при пожаре выносить в первую очередь, а после заката звонить только в экстренных случаях:
Скоро, скоро Новый год
Рубрики
Отче наш
Отче наш, Иже еси́ на небесе́х! Да святи́тся имя Твое́, да прии́дет Ца́рствие Твое, да будет воля Твоя, я́ко на небеси́ и на земли́. Хлеб наш насу́щный даждь нам днесь; и оста́ви нам до́лги наша, я́коже и мы оставля́ем должнико́м нашим; и не введи́ нас во искушение, но изба́ви нас от лука́ваго
Под контролем
- Академия студенчества
- ИЛИМК
- Офис академического письма
- МАЛиМК
- НОЦ Лингво-инновационных технологий
- Партнерская сеть «Институт Пушкина»
- Центр делового образования
- Центр «Лингва»
- Управление инновациями и инвестициями
- Финансовый менеджмент
- Кафедра ИТЭ
- Кафедра ЦЭИИТ
- Бизнес-информатика + Кванториум
- ВКР: Бизнес-информатика
- Бизнес-информатика on-line
- Бизнес-информатика — драйв цифровой трансформации
- ЭУ-160
- ЭУ-235
- ЭУ-320
- ЭУ-442
- ЭУ-419 (архив)
- ЭУ-444, 461 (архив)
- ЭУ-459 (архив)
- ЭУ-434 (архив)
- Магистры Бизнес-информатики
- Магистратура ВШЭУ
- Технологическая площадка
- Digital Experience Workshop
- Cтэк технологий Web-разработки: шаг за шагом
- Абитуриент ВШЭУ — 2018
- Школа бизнеса ВШЭУ
- Кибер-студент
- Зеркало сайта
- ИТ-марафон
- Покори свой Олимп
- Digital Experience
- ООО «ЮЖУРАЛСЕРВИС»
- Школа перспективных технологий
- Бизнес‑информатике 15 лет
Получение даты создания и изменения файла в Python
Существуют случаи, когда возникает потребность получить информацию о дате создания и последнего изменения файла. Это может быть полезно во многих контекстах, например, при создании скриптов для автоматического архивирования файлов или при работе с системами управления версиями.
В Python есть несколько способов получить эту информацию, причем большинство из них являются кросс-платформенными и будут работать как на Linux, так и на Windows.
Самый простой и распространенный способ — использование встроенного модуля os . Этот модуль содержит функцию os.path.getmtime() , которая возвращает время последнего изменения файла в виде числа с плавающей точкой, представляющего секунды с начала эпохи (обычно это 01.01.1970 г.).
import os filename = "test.txt" mtime = os.path.getmtime(filename) print(mtime)
Этот код вернет время последнего изменения файла «test.txt». Чтобы преобразовать это время из секунд с начала эпохи в более читаемый формат, можно использовать функцию datetime.fromtimestamp() :
import os from datetime import datetime filename = "test.txt" mtime = os.path.getmtime(filename) mtime_readable = datetime.fromtimestamp(mtime) print(mtime_readable)
Получение времени создания файла немного сложнее и отличается в зависимости от операционной системы. На Windows можно использовать функцию os.path.getctime() , которая работает аналогично os.path.getmtime() , но возвращает время создания файла. На Linux, к сожалению, такой функции нет, поэтому придется использовать функцию os.stat() , которая возвращает объект с метаданными файла, включая время его создания.
import os from datetime import datetime filename = "test.txt" stat = os.stat(filename) ctime = stat.st_ctime ctime_readable = datetime.fromtimestamp(ctime) print(ctime_readable)
Таким образом, получение информации о времени создания и изменения файла в Python — это относительно простая задача, которая может быть выполнена с помощью встроенного модуля os .
Статья Извлекаем метаданные из фото, аудио и видео файлов с помощью Python
Давайте представим, что к вам попал некий файл: изображение, видео, а может быть аудиофайл, и вам нужно узнать о данном файле чуть больше информации чем отображается в свойствах файла. Если она там есть. Ведь современные камеры, смартфоны и прочее фото и видео оборудование добавляет их в файл в автоматическом режиме. И если файл не обработан программами, которые могут их затереть, то из таких метаданных, иногда, можно получить много разнообразной информации. В этом вам могут помочь специализированные программы, а можно воспользоваться небольшим скриптом на Python и получить необходимую информацию. Давайте создадим скрипт, который будет получать метаданные из фото, видео и аудио файлов.
Что понадобиться?
Для работы с изображениями установим библиотеку Pillow. Именно с ее помощью мы будем получать метаданные, если они, конечно же есть. А также установим библиотеку ffmpeg, которая работает с очень большим количеством форматов как аудио, так и видео. Причем, извлекает метаданные из фото (правда не все). Пишем в терминале команду:
pip install Pillow ffmpeg-python
После того, как все библиотеки будут установлены, импортируем нужные модули в скрипт.
import os.path from pprint import pprint import ffmpeg from PIL import Image, ExifTags
Давайте приступим к созданию скрипта.
Извлекаем метаданные из файлов JPG
Создадим функцию для извлечения метаданных из изображения. Я назвал ее image_metadata(path_f). На входе она принимает только один параметр, а именно путь к файлу изображения. Затем с помощью модуля Image библиотеки Pillow откроем файл. Создадим небольшой словарь, в который добавим базовые данные о фото, такие как имя, разрешение, ширина, высота и прочие. Эти данные будут выводиться пользователю в том случае, если метеданных в фото не оказалось или они не были прочитаны.
img = Image.open(path_f) info_dict =
Теперь, если данные exif были прочитаны и не было вызвано исключение, формируем словарь из полученных значений, к которому добавим в качестве ключа название тега. Для этого будем использовать параметр ExifTags.TAGS. Если вы распечатаете данный параметр, на выходе получите словарь с тегами, которые могут содержаться в изображении.
После того, как словарь будет сформирован, нужно вывести полученные значения пользователю на экран. Пробегаемся в цикле по словарю exif. Здесь, если мы получаем значение тега «GPSInfo», печатаем данные немного по другому, так как за данным тегом есть еще словарь со значениями широты, долготы, направления и прочие параметры. Для наших целей достаточно будет получить значение широты и долготы. Поэтому указываем значения json, где они содержаться, для вывода на экран.
Также, некоторые значения в json представлены в байтах, а потому из надо декодировать. Но, если мы будем декодировать все значения, то на экран ничего не выведется. Поэтому делаем проверку, является ли данный параметр байтами. Если да, декодируем и выводим уже декодированное значение.
exif = print(f'\n[+] Метаданные фото: \n') for info in exif: if info == 'GPSInfo': print(f': lat - long ') else: if isinstance(exif[info], bytes): info_d = exif[info].decode() print(f': ') else: print(f': ')
Как вы помните, в изображении тегов может и не содержаться. Поэтому будет вызвано исключение AttributeError. Но, в самом начале функции мы создавали словарь с базовыми параметрами изображения. Вот их и выведем в случае, когда сработает исключение и метаданных в изображении найдено не будет. Поэтому, оборачиваем код в try — except и когда сработает исключение пробегаемся в цикле по созданному ранее словарику из которого извлекаем значения и выводим на печать.
print(f'\n[+] Информация о фото: \n') for k, v in info_dict.items(): print(f": ") exit(0)
Полные код функции извлечения метаданных из изображения
def image_metadata(path_f): img = Image.open(path_f) info_dict = < "Имя файла": os.path.split(path_f)[1], "Разрешение изображения": img.size, "Высота изображения": img.height, "Ширина изображения": img.width, "Формат изображения": img.format, "Режим изображения": img.mode, "Анимированное изображение": getattr(img, "is_animated", False), "Кадров в изображении": getattr(img, "n_frames", 1) >try: exif = print(f'\n[+] Метаданные фото: \n') for info in exif: if info == 'GPSInfo': print(f': lat - long ') else: if isinstance(exif[info], bytes): info_d = exif[info].decode() print(f': ') else: print(f': ') except AttributeError: print(f'\n[+] Информация о фото: \n') for k, v in info_dict.items(): print(f": ") exit(0)
Извлекаем метаданные из видео и аудио
Для извлечения метаданных из аудио и видео воспользуемся библиотекой для работы с медиафайлами ffmpeg. Конечно же, функционал данной библиотеки гораздо больше, чем просто извлечение метаданных. Но, нам требуется далеко не все, а потому, если вы желаете чуть более подробно познакомиться с данной библиотекой, можете начать вот с этой статьи.
Двигаемся дальше. Для того, чтобы работать с данной библиотекой в скрипте, нужно ее для начала установить. Если вы используете Linux, просто наберите команду:
sudo apt-get install ffmpeg
Если же вам нужно установить данную библиотеку на Windows, перейдите на эту
Ссылка скрыта от гостей
, скачайте и установите файл.
После того, как данная библиотека будет установлена в вашу операционную систему, нужно установить модуль обертку, с помощью которого мы и будем работать с ffmpeg. На самом деле, модулей для работы с ffmpeg очень много. Но мы воспользуемся ffmpeg-python. Если вы читали статью с самого начала, то он у вас уже будет установлен. Если же нет, то наберите в терминале:
pip install ffmpeg-python
Теперь создадим функцию для работы с файлами. Я назвал ее vid_aud_matadata(patn_f). На вход она принимает путь к файлу. После пытается считать метаданные. И если это удается, с помощью pprint мы выводим данные на печать в необработанном виде. А именно, в формате json. При желании вы можете написать функцию, которая будет сохранять данные значения в файл json.
print(f'\n[+] Метаданные файла: \n') pprint(ffmpeg.probe(patn_f)["streams"])
Обернем данный код в try — except, чтобы обработать исключение, если на входе функции будет файл, метаданные которого не получиться прочитать с помощью данной библиотеке. В исключение мы просто добавим сообщение, что данный формат файлов не поддерживается.
Код функции извлечения метаданных аудио — видео
def vid_aud_matadata(patn_f): try: print(f'\n[+] Метаданные файла: \n') pprint(ffmpeg.probe(patn_f)["streams"]) except ffmpeg._run.Error: print('[-] Неподдерживаемый формат')
Как видите, извлечение метаданных из изображений, аудио или видео, не такое уж сложное занятие. С помощью данного скрипта можно извлечь метаданные из изображения, если они в нем содержаться, а также метаданные из видео и аудио файлов.
Функция обработки пользовательского ввода
Ну и теперь, когда функции для извлечения метаданных у нас уже созданы, напишем функцию для обработки пользовательского ввода. Для начала будем запрашивать путь к медиафайлу. Проверяем, существует ли данный файл. Если файл не существует, сообщаем об этом пользователю. Если же он существует, проверяем его расширение. И если расширение равно «.jpg» или «.jpeg» вызываем функцию извлечения метаданных из изображения, в которую передаем путь к файлу. Если же расширение не является изображением нужного нам формата, вызываем функцию обработки аудио и видео файлов, куда также передаем путь к файлу.
if __name__ == "__main__": path_file = input('[~] Введите путь к файлу: ') if not os.path.exists(path_file): print('[-] Файла не существует') else: if path_file.endswith(".jpg"): image_metadata(path_file) elif path_file.endswith(".jpeg"): image_metadata(path_file) else: vid_aud_matadata(path_file)
Как вы помните, ffmpeg может извлечь метаданные из файлов множества медиаформатов. И если к нему попадет картинка в формате «png», то метаданные из нее будут извлечены и выведены на экран. Тут смысл в том, что в основном, метаданные, такие как координаты, сведения о камере и прочее содержаться в основном в формате «jpg». Хотя, исключать их наличие в других форматах не совсем правильно.
Вот, для примера, метаданные, которые получены из фото, которое я сделал на телефон, предварительно включив перед этим геоданные.
Метаданные из фото
А это небольшая часть метаданных из видео, которое скачано из YouTube.
