Comment regrouper les fichiers avec le même préfixe mais des extensions différentes dans des dossiers en utilisant Python

Après, par exemple, avoir ré-encodé vos vidéos, vous avez souvent un groupe de fichiers dans le même répertoire nommés par ex. MyMovie.avi et MyMovie.avi.mkv.

Le script suivant triera tous les fichiers avec le même préfixe (MyMovie) dans un répertoire appelé comme le préfixe. Ceci permet un tri et une comparaison faciles de ces fichiers.

Les autres fichiers ne seront pas touchés. L’opération est effectuée non-récursivement et aucun fichier ne sera écrasé.

Notez que la liste des extensions de fichier est codée en dur et les doubles extensions telles que .avi.mkv sont aussi traitées comme des extensions standard. La vérification d’extension est effectuée en utilisant .endswith()

group_files_by_prefix.py
#!/usr/bin/env python3
import argparse
import os
from collections import defaultdict

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("directory", help="path to the directory")
    args = parser.parse_args()

    directory = args.directory

    extensions = [
        ".avi",
        ".mkv",
        ".mp4"
    ]

    # Ajoute les extensions telles que ".avi.mp4" au début
    # pour qu'on les vérifie en premier
    extensions = [e1 + e2 for e1 in extensions for e2 in extensions] + extensions

    files_by_prefix = defaultdict(list)
    for file in os.listdir(directory):
        # Sépare l'extension
        for potential_extension in extensions:
            if file.endswith(potential_extension):
                file_prefix = file[:-len(potential_extension)]
                files_by_prefix[file_prefix].append(file)

    # Ignore les préfixes avec un seul fichier
    files_by_prefix = {k: v for k, v in files_by_prefix.items() if len(v) > 1}

    # Crée un répertoire pour chaque préfixe et déplace tous les fichiers dedans
    for prefix, files in files_by_prefix.items():
        os.makedirs(os.path.join(directory, prefix), exist_ok=True)
        # Déplace le fichier si la destination n'existe pas
        for file in files:
            print(f"{file} -> {prefix}/{file}")
            os.rename(os.path.join(directory, file), os.path.join(directory, prefix, file))

Consultez les articles similaires par catégorie : Python