EXIF is a metdata specification largely used by modern versions of JPEG and TIFF. It allows you embed a wealth of descriptive information into a picture taken by your camera. Notably, this also, usually, includes one or more timestamps. In the event that you find yourself with a directory of anonymously-named images that you’d like to rename with their timestamps, I’ve written a quick Python script to automate such a task. This script assumes that you have the exif tool installed. It’s readily available for both Linux and Mac OS.
Code
import os
import subprocess
import glob
import datetime
_PICTURE_PATH = '/my/pictures/are/here'
_EXIF_COMMAND = 'exif'
_FILESPEC = '*.jpg'
_NEW_FILENAME_TEMPLATE = '{timestamp_phrase}.jpg'
_COMMON_EXIF_TIMESTAMP_FIELD_NAME = 'Date and Time'
_EXIF_TIMESTAMP_FORMAT = '%Y:%m:%d %H:%M:%S'
_OUTPUT_TIMESTAMP_FORMAT = '%Y%m%d-%H%M%S'
def _get_exif_info(filepath):
cmd = [_EXIF_COMMAND, '-m', filepath]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
exif_tab_delimited = p.stdout.read()
r = p.wait()
if r != 0:
raise ValueError("EXIF command failed: %s" % (cmd,))
lines = exif_tab_delimited.strip().split('n')[1:]
pairs = [l.split('t') for l in lines]
return dict(pairs)
def _get_filepaths(path):
full_pattern = os.path.join(path, _FILESPEC)
for filepath in glob.glob(full_pattern):
yield filepath
def _main():
for original_filepath in _get_filepaths(_PICTURE_PATH):
exif = _get_exif_info(original_filepath)
try:
exif_timestamp_phrase = exif[_COMMON_EXIF_TIMESTAMP_FIELD_NAME]
except KeyError:
print("ERROR: {0}: Missing timestamp field".format(original_filepath))
print('')
continue
timestamp_dt =
datetime.datetime.strptime(
exif_timestamp_phrase,
_EXIF_TIMESTAMP_FORMAT)
output_timestamp_phrase =
timestamp_dt.strftime(_OUTPUT_TIMESTAMP_FORMAT)
new_filename = _NEW_FILENAME_TEMPLATE.format(
timestamp_phrase=output_timestamp_phrase)
new_filepath = os.path.join(path, new_filename)
print("{0} => {1}".format(original_filepath, new_filepath))
os.rename(original_filepath, new_filepath)
if __name__ == '__main__':
_main()
Usage
- Save the script to a file.
- Update the value for
_PICTURE_PATH
to the path of your pictures.
- Optionally, update
_FILESPEC
to the correct pattern/casing of your files.
- Optionally, update
_COMMON_EXIF_TIMESTAMP_FIELD_NAME
to the correct EXIF field-name if the device that created the pictures used a different field-name (you can use the exif tool directly to explore your images).
- If the timestamp is not formatted using the standard colon-delimited EXIF timestamp (e.g. 2012:04:29 20:51:32), update
_EXIF_TIMESTAMP_FORMAT
to reflect the proper format.
- Run using whatever name you gave the script:
$ python rename_images.py
Output
Success output will look something like:
./IMG_3871.jpg => ./20131127-143832.jpg
./IMG_3872.jpg => ./20131127-143836.jpg
./IMG_3879.jpg => ./20131127-144045.jpg
./IMG_3880.jpg => ./20131127-144105.jpg
./IMG_3927.jpg => ./20131128-172021.jpg
...
Like this:
Like Loading...