In Python, how do I read the exif data for an image? In Python, how do I read the exif data for an image? python python

In Python, how do I read the exif data for an image?


You can use the _getexif() protected method of a PIL Image.

import PIL.Imageimg = PIL.Image.open('img.jpg')exif_data = img._getexif()

This should give you a dictionary indexed by EXIF numeric tags. If you want the dictionary indexed by the actual EXIF tag name strings, try something like:

import PIL.ExifTagsexif = {    PIL.ExifTags.TAGS[k]: v    for k, v in img._getexif().items()    if k in PIL.ExifTags.TAGS}


You can also use the ExifRead module:

import exifread# Open image file for reading (binary mode)f = open(path_name, 'rb')# Return Exif tagstags = exifread.process_file(f)


For Python3.x and starting Pillow==6.0.0, Image objects now provide a "public"/official getexif() method that returns a <class 'PIL.Image.Exif'> instance or None if the image has no EXIF data.

From Pillow 6.0.0 release notes:

getexif() has been added, which returns an Exif instance. Values canbe retrieved and set like a dictionary. When saving JPEG, PNG or WEBP,the instance can be passed as an exif argument to include any changesin the output image.

As stated, you can iterate over the key-value pairs of the Exif instance like a regular dictionary. The keys are 16-bit integers that can be mapped to their string names using the ExifTags.TAGS module.

from PIL import Image, ExifTagsimg = Image.open("sample.jpg")img_exif = img.getexif()print(type(img_exif))# <class 'PIL.Image.Exif'>if img_exif is None:    print('Sorry, image has no exif data.')else:    for key, val in img_exif.items():        if key in ExifTags.TAGS:            print(f'{ExifTags.TAGS[key]}:{val}')            # ExifVersion:b'0230'            # ...            # FocalLength:(2300, 100)            # ColorSpace:1            # ...            # Model:'X-T2'            # Make:'FUJIFILM'            # LensSpecification:(18.0, 55.0, 2.8, 4.0)            # ...            # DateTime:'2019:12:01 21:30:07'            # ...

Tested with Python 3.8.8 and Pillow==8.1.0.