La .Taverne de l'Invisible

Une page de Le Lab de la taverne

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

Par Darko Stankovski, 17/01/2024 (Mise à jour 29/03/2026) — Débutant

10 ans après avoir proposé ce même article illustré d'un code Bash, il est temps de proposer une version plus accessible en Python.

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). Vous pourriez simplement supprimer tous les jpgs mais vous courrez le risque de supprimer une photo qui n'a été prise qu'en jpgs. Pour rappel, c'était ce qui pouvait arriver avec mon vieux Canon G11.

Il nous faudra 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 peut tenir 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)

Le programme 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, commençons simple et améliorons le par la suite.

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.

On a ici un programme utilisable mais qui peut casser pour plein de raisons.

Vers une fonction

Le code précédent a sa place dans une fonction qui pourra être paramétrée avec, au moins, le nom du chemin où sont les photos :

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)

Dans cette fonction, missing_ok est aussi un paramètre mais optionnel. Vous pouvez choisir que ce n'est pas ok.

Cette fonction, je vous la propose aussi simplement ici. Vous pouvez directement l'intégrer dans un script où vous allez l'appeler. À vous de voir comment obtenir le chemin vers le répertoire de travail. Ce peut être une constante ou un paramètre du script.

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.

Licence Creative Commons

Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 4.0 International