Last active
October 7, 2015 10:57
-
-
Save yorch/3154372 to your computer and use it in GitHub Desktop.
Rename JPEG files according to EXIF-date using PIL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## {{{ http://code.activestate.com/recipes/578219/ (r2) | |
# -*- coding: Windows-1251 -*- | |
''' | |
rename_to_exiftime.py | |
Rename JPEG files according to EXIF-date using PIL | |
If global variable CREATE_HARDLINK is set, script creates Windows (XP) batch file | |
for creating hardlink version of source files | |
Author: Denis Barmenkov <[email protected]> | |
Modified by: Jorge Barnaby <[email protected]> | |
Improved rename process on duplicates | |
Copyright: this code is free, but if you want to use it, | |
please keep this multiline comment along with function source. | |
Thank you. | |
2009-02-10 18:14 | |
2015-01-09: | |
Python Image Library needs to be installed: | |
`pip install pillow` | |
''' | |
from PIL import Image | |
import os | |
import re | |
import sys | |
import time | |
CREATE_HARDLINK=0 | |
def extract_jpeg_exif_time(jpegfn): | |
if not os.path.isfile(jpegfn): | |
return None | |
try: | |
im = Image.open(jpegfn) | |
if hasattr(im, '_getexif'): | |
exifdata = im._getexif() | |
ctime = exifdata[0x9003] | |
#print ctime | |
return ctime | |
except: | |
_type, value, traceback = sys.exc_info() | |
print "Error:\n%r", value | |
return None | |
def get_exif_prefix(jpegfn): | |
ctime = extract_jpeg_exif_time(jpegfn) | |
if ctime is None: | |
return None | |
ctime = ctime.replace(':', '') | |
ctime = re.sub('[^\d]+', '_', ctime) | |
return ctime | |
def rename_jpeg_file(fn): | |
if not os.path.isfile(fn): | |
return 0 | |
ext = os.path.splitext(fn)[1].lower() | |
if ext not in ['.jpg', '.jpeg', '.jfif', '.nef', '.png']: | |
return 0 | |
path, base = os.path.split(fn) | |
#print base # status | |
prefix = get_exif_prefix(fn) | |
if prefix is None: | |
print '%s could not be renamed' % (base) | |
return 0 | |
if base.startswith(prefix): | |
print '%s file already renamed' % (base) | |
return 0 # file already renamed to this prefix | |
exists = True | |
index = 0 | |
while exists: | |
if index == 0: | |
new_name = prefix + ext # + '_' + base | |
else: | |
new_name = prefix + '_' + str(index) + ext | |
new_full_name = os.path.join(path, new_name) | |
exists = os.path.isfile(new_full_name) | |
index = index + 1 | |
if CREATE_HARDLINK: | |
f = open('CREATE_HARDLINK.cmd', 'a') | |
f.write('fsutil hardlink create "%s" "%s"\n' % (new_full_name, fn)) | |
f.close() | |
else: | |
try: | |
os.rename(fn, new_full_name) | |
print '%s renamed to %s' % (base, new_name) | |
except: | |
print 'ERROR rename %s --> %s' % (fn, new_full_name) | |
return 0 | |
return 1 | |
def rename_jpeg_files_in_dir(dn): | |
names = os.listdir(dn) | |
count=0 | |
for n in names: | |
file_path = os.path.join(dn, n) | |
count += rename_jpeg_file(file_path) | |
return count | |
if __name__=='__main__': | |
try: | |
path = sys.argv[1] | |
except IndexError: | |
print '''Usage: | |
rename_to_exiftime.py filename.[jpeg|jpg|jfif] | |
or | |
rename_to_exiftime.py dirname | |
''' | |
sys.exit(1) | |
if os.path.isfile(path): | |
rename_jpeg_file(path) | |
elif os.path.isdir(path): | |
count = rename_jpeg_files_in_dir(path) | |
print '%d file(s) renamed.' % count | |
else: | |
print 'ERROR: path not found: %s' % path | |
## end of http://code.activestate.com/recipes/578219/ }}} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment