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


 
Mots clés :  
  python 
    >   Articles connexes :

Trim (ou strip) pour votre terminal


Supprimer les espaces, tabulation et sauts de lignes en début et fin de ligne peut être très utiles lors de l'utilisation courante du...

Bruteforce Vigenère



3474169