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 ...