#!python #=============================================================================== # @filename exif-renamer-1.0.py # @author Dylan Smith # @version 1.0 # # DESCRIPTION: # This script takes a single directory as an argument, and will attempt to # rename all files in that direction based on the EXIF datestamp of the # file. If EXIF data is not available, the script will use the filesystem # ctime to generate the new filename. # # REQUIREMENTS: # This script requires the EXIF.py library available at: # http://sourceforge.net/projects/exif-py/ # # USAGE: # exif-renamer-1.0.py #=============================================================================== import EXIF import sys import os import string import datetime ## function definitions #------------------------------------------------------------------------------- def date_from_ctime(file): ctime = os.path.getctime(file.name); d = datetime.datetime.fromtimestamp(ctime) date = '%s:%s:%s %s:%s:%s' % (d.year, pad(d.month), pad(d.day), pad(d.hour), pad(d.minute), pad(d.second)) return str(date) def date_from_exif(file): data = EXIF.process_file(file, details=False, debug=False) if not data or not data.has_key('EXIF DateTimeDigitized'): return False else: return str(data['EXIF DateTimeDigitized']) def format_exif_date(date): name = date.replace(':', '') name = name.replace(' ', '_') return name def pad(n): return str(n).rjust(2,'0') def rename_image(filename): if not valid_image(filename): return try: file = open(filename, 'rb') except: print "'%s': Cannot open for reading.\n" % filename return date = date_from_exif(file) op = '[EXIF] '; if (date == False): date = date_from_ctime(file) op = '[TIME] '; file.close() suffix = os.path.splitext(filename)[1] newname = format_exif_date(date) + string.lower(suffix) if os.path.exists(newname): print '[FAIL] ' + filename + ' already exists, ignoring...' return else: print op + filename + ' -> ' + newname os.rename(filename, newname) def valid_image(filename): return string.lower(os.path.splitext(filename)[1]) in ['.jpg', '.jpeg', '.tiff'] ## main loop #------------------------------------------------------------------------------- dir = sys.argv[1] if not os.path.isdir(dir): print '"' + dir + '" is not a directory. Exiting...' exit() os.chdir(dir) files = os.listdir('.') # confirm? confirm = raw_input('Process ' + str(len(files)) + ' files in directory "' + dir + '"? [y/n]: ') if string.lower(confirm) != 'y': print 'Exiting...' exit() for filename in files: rename_image(filename)