Un script python pour trier les photos grâce aux données EXIF des JPG pris par des appareils photos et des smartphones
0x01. CONCEPT
La hierarchie est faite par la date récupérée dans les données EXIF, structurée ainsi :
sorted/2018/01 - Janvier/30 sorted/2018/02 - Fevrier/29 sorted/2018/03 - Mars/24 sorted/2018/03 - Mars/25 sorted/2018/03 - Mars/26
0x02. SCRIPT PYTHON
#!python ############################################################################### # # Imports # ### import EXIF import sys import os import glob from datetime.datetime import now # datetime.datetime.now ############################################################################### # # Globals # ### months = { '01': 'Janvier', '02': 'Fevrier', '03': 'Mars', '04': 'Avril', '05': 'Mai', '06': 'Juin', '07': 'Juillet', '08': 'Aout', '09': 'Septembre', '10': 'Octobre', '11': 'Novembre', '12': 'Decembre' } path_unsorted = "/path/to/photos/unsorted" path_sorted = "/path/to/photos/sorted" ############################################################################### # # Functions # ### # Log ######################################################################### def log(txt,logfile="report.log"): curr_date = now().year + "/" + now().month + "/" + now().day curr_date += now().hour + "/" + now().minute + "/" + now().second msg = "["+curr_date+"] " + txt + " " open(logfile,"at").write(msg) # Get date #################################################################### def get_date(filename): """ """ try: file=open(filename, 'rb') except: log("Error: cannot open '"+filename+"' for reading") continue # get the tags data = EXIF.process_file(file, details=False, debug=False) if not data: log("Error: no EXIF data in '"+filename+"'") continue file.close() date = "unknown" year = "unknown_year" month = "unknown_month" day = "unknown_day" try: date = data['Image DateTime'] year = date.split(":")[0] month = months[date.split(":")[1]] day = date.split(":")[2].split(" ")[0] except: try: date = str(data['EXIF DateTimeDigitized']) year = date.split(":")[0] month = months[date.split(":")[1]] day = date.split(":")[2].split(" ")[0] except: pass return( {'year':year,'month':month,'day':day} ) # Basename #################################################################### def basename(filename): """ In: /path/to/filename Out: filename """ return filename.split("/")[-1] # Get files ################################################################### def get_files(folder,pattern="*.[jJ][pP][eE?][gG]",maxdepth=128): file_list = [] for i in range(1,maxdepth): pattern = "*/" + pattern file_list += glob.glob(pattern) return(file_list) # Copy file ################################################################### def cp(filesource,filedest): open(filedest,"wb").write( open(filensource,"rb").read() ) # Make dir #################################################################### def mkdir(folder): destfolder = "" for subfolder in folder.split("/"): destfolder += subfolder + "/" try: os.mkdir(destfolder) except: pass ############################################################################### # # Operations # ### for src_filename in get_files(unsorted): dest_dir = path_sorted + "/" + year + "/" + month + "/" + day dst_filename = dest_dir + "/" + basename(src_filename) mkdir( dest_dir ) cp( from_file , dest_file ) os.system(cmd_mkdir) os.system(cmd_copyfile)
=> Écrit par : Nicolas, le 07 janvier 2019