Skip to content

Instantly share code, notes, and snippets.

@danielrocher
Last active March 11, 2018 17:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danielrocher/c634898068f09aa2e9bbd3aec20ccd0e to your computer and use it in GitHub Desktop.
Save danielrocher/c634898068f09aa2e9bbd3aec20ccd0e to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Written by Daniel Rocher <daniel.rocher@resydev.fr>
# License GPL-3.0-only
# Copyright (C) 2018
"""
Restore file creation date from exif datas. Rename file, format : %Y%m%d-%H%M%S.jpg
This script require python3-exif.
On debian/ubuntu :
sudo apt install python3-exif
"""
import sys, os, time, exifread
from datetime import datetime
def getExifFromFile(filename):
tags=None
try:
fd = open(filename, 'rb')
tags=exifread.process_file(fd)
fd.close()
except:
return None
return tags
def convertDateFromString(datetimeoriginal):
try:
return datetime.strptime(datetimeoriginal, '%Y:%m:%d %H:%M:%S')
except:
return None
def getDateTimeOriginalFromTags(tags):
datetimeoriginal=None
try:
datetimeoriginal=convertDateFromString(str(tags['EXIF DateTimeOriginal']))
if datetimeoriginal:
return datetimeoriginal
except:
pass
try:
return convertDateFromString(str(tags['EXIF DateTimeDigitized']))
except:
return None
def renameFile(filename, newfilename):
try:
os.rename(filename, newfilename)
return True
except:
sys.stderr.writelines("Impossible to rename file :{}\n".format(filename))
return False
def changeUtimeForFile(filename, datetimeoriginal):
try:
utime=time.mktime(datetimeoriginal.utctimetuple())
os.utime(filename, (utime, utime))
return True
except:
sys.stderr.writelines("Impossible to change utime for file :{}\n".format(filename))
return False
def usage(progname):
print ("""
{0} [files]
example:
{0} *.jpg
""".format(progname))
def proccess(filename):
tags=getExifFromFile(filename)
if tags:
datetimeoriginal=getDateTimeOriginalFromTags(tags)
if datetimeoriginal:
changeUtimeForFile(filename, datetimeoriginal)
newfilename=datetimeoriginal.strftime('%Y%m%d-%H%M%S.jpg')
if renameFile( filename, newfilename):
print ("{} -> {} (EXIF DateTimeOriginal : {})".format(filename, newfilename, datetimeoriginal))
else:
sys.stderr.writelines("Impossible to retrieve DateTimeOriginal data from exif datas (file :{})\n".format(filename))
else:
sys.stderr.writelines("Impossible to retrieve exif data from {}\n".format(filename))
if __name__ == '__main__':
args=sys.argv[1:]
if len(args)<2:
usage(sys.argv[0])
sys.exit(1)
for arg in args:
proccess(arg)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment