Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Write EXIF metadata to text file for plugin.
# Write EXIF metadata to text file for plugin.
import os
from os import listdir
from os.path import isfile, join
import PIL
from PIL import Image
from PIL.ExifTags import GPSTAGS
from PIL.ExifTags import TAGS
# The first two functions are borrowed from github user @jpstroop
def _map_key(k):
return TAGS[k]
except KeyError:
return GPSTAGS.get(k, k)
# Creates a dictionary of image EXIF meta data from an image, borrowed from a github gist
def get_exif(image_path):
metadata = {}
with as i:
info = i._getexif()
[ metadata.__setitem__(_map_key(k), v) for k, v in info.items() ]
return metadata
except AttributeError:
return None
#Creates a text file with some exif meta data.
def write_exif_file(directory):
# Open the exif.txt file, create if it doesn't exist, in the current folder.
txt = open(directory+'/exif.txt', 'w')
for file in os.listdir(directory):
# check the files which are end with specific extension
# Everything that I want to have EXIF information for is a jpg, but you can add others too.
if file.endswith(".jpg"):
# Need to iterate through the files in the list and pass each to the
image = get_exif(directory +'/'+os.path.join(file))
os.path.join(file) + ': ' +
str(image.get('Model')) +
' with a ' + str(image.get('LensModel')) +
' - ' + str(image.get('ExposureTime')) + 's, ' + # I want to change this to fractions, but it works for now.
'f/' + str(image.get('FNumber')) +
' at ISO-' + str(image.get('ISOSpeedRatings')) +
# Close the text file now that we are done with it.
return None
# The directory of the source photos, the same as PHOTO_LIBRARY in
# I run this in a WSL instance, but pelican is run on the host windows machine, hence the sample directory
dir = '/mnt/c/Users/jeff/Pictures'
# This walks through the directories and for each it calls the write exif file function
for root, subdirectories, files in os.walk(dir):
for subdirectory in subdirectories:
print(os.path.join(root, subdirectory))
write_exif_file(os.path.join(root, subdirectory))
Copy link

j0el commented May 31, 2022

Thanks, very helpful. I am not a python expert, but I added this function

from fraction import Fraction
def exposure(ExposureTime):
return( str(Fraction(ExposureTime)))

and changed line 49
' - ' + exposure(image.get('ExposureTime')) + 's, ' + # I want to change this to fractions, but it works for now.

to show shutter speed as a fraction

Copy link

Jeffmackinnon commented Oct 25, 2022

How did I forget to comment on this, that's a great idea.

I'm the farthest thing from a python anything, at best I'm a n00b.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment