Effacer facilement, en Python, les jpgs quand on photographie en RAW+jpg

Il y a presque 10 ans, je publiais ce même article illustré d’un code Bash. En 2014, je me remettais juste à Python mais on était encore en Python 2, j’admet qu’alors ma compétence était plus limitée. Il est cependant temps de vous proposer le même article, mais évidemment avec du Python moderne.

Reprenons le contexte : vous photographiez en RAW+jpg et souhaitez supprimer la version jpg (car après tout le fichier jpg généré à partir du RAW sera meilleur). En soi, c’est facile, vous les supprimez… Mais vous courez le risque de supprimer des photos qui n’ont été prises qu’en jpg. Pour rappel, c’était le cas de mon vieux Canon G11.

Ce que nous allons faire, c’est donc écrire un petit programme qui parcourt le répertoire des fichiers photo et pour chaque fichier RAW efface le jpg équivalent.

Le problème

Avant de voir comment faire, une petite explication de ce que l’on a sur sa carte mémoire. Lors d’une prise de vue en RAW+jpg, l’appareil enregistre deux photos (une en RAW, l’autre en jpg) sur la carte mémoire. Les deux photos ont le même nom (disons IMG_0034) mais avec une extension différente en fonction de s’il s’agit d’une RAW ou d’une jpg. Nous aurons donc, pour un appareil Canon, IMG_0034.CR2 et IMG_OO34.JPG. Une photo prise uniquement en jpg n’existera qu’en une seule version, disons IMG_0035.JPG.

Un programme de 5 lignes

En Python, le programme est tout simple et tient en 5 lignes :

from pathlib import Path

photodir = Path('.').resolve()

for file in photodir.glob('*.CR2'):
    jpg_name = file.with_suffix(".JPG")

    jpg_name.unlink(missing_ok=True)

Oui alors, je vais les commenter mais avant, en effet, il tient en 5 lignes car je ne me suis pas embêté à gérer l’accès au répertoire. Celui-ci est le répertoire courant, écrit en dur. De même, les extensions parcourues sont ici limitées. Néanmoins, on va voir la simplicité et après, comment l’améliorer.

J’utilise ici la bibliothèque pathlib qui me permet de travailler sur les chemins de manière moderne. Cette bibliothèque fait parti de la distribution standard.

Je commence par construire le chemin vers le répertoire courant (ligne 3).

Sur la ligne 5, j’utilise la méthode .glob() qui me permet d’utiliser les glob afin de filtrer les fichiers du répertoire et ne retenir que ceux avec l’extension .CR2. Cette méthode me retourne un générateur sur lequel je vais devoir itérer. C’est ce que je veux faire.

Le générateur me retourne, à chaque itération, un objet de type Path. Ligne 5, la méthode .with_suffix() de l’objet Path retourne un objet Path où le nom de l’extension a été remplacé par celle en argument. Ce nouvel objet Path, jpg_name, est abstrait : il représente un chemin qui n’existe pas forcément.

Mais je vais pouvoir l’utiliser ligne 6 pour supprimer le fichier, si il existe, avec la méthode .unlink(). Si le fichier n’existe pas (cas où on n’a une photo que en RAW), cette méthode lève une exception mais l’argument missing_ok=True permet d’ignorer cette exception (cela correspond à un rm -f en shell).

Et voilà, c’est tout… il faut dire qu’on est bien aidé par la bibliothèque pathlib.

Vers une fonction

À partir de là, ce code tient bien dans une fonction :

from pathlib import Path

def remove_jpg_from_raw(dir_path:Path|str, missing_ok:bool=True):
    photodir = Path(dir_path).resolve()

    for file in photodir.glob('*.CR2'):
        jpg_name = file.with_suffix(".JPG")

        jpg_name.unlink(missing_ok=missing_ok)

Ainsi, le chemin pourra être un paramètre de votre exécution. À vous de choisir comment l’obtenir.

Vous pouvez également faire évoluer cette fonction en lui ajoutant, en paramètres optionnels, les extension à utiliser pour les fichiers RAW et jpg.

Vous pouvez retrouver ce code sur mon projet GitHub dans le module photocleanup.py.

Si vous avez aimé ce post, n’hésitez pas à laisser un commentaire ci-dessous ou sur la page Facebook 😉

À propos de... Darko Stankovski

iT guy, photographe et papa 3.0, je vous fais partager mon expérience et découvertes dans ces domaines. Vous pouvez me suivre sur les liens ci-dessous.

Vous aimerez aussi...

Laisser un commentaire