Wie man Dateien mit gleichem Präfix aber unterschiedlichen Erweiterungen mit Python in Ordner gruppiert

Nach dem beispielsweise Neukodieren Ihrer Videos haben Sie oft eine Reihe von Dateien im selben Verzeichnis, die z.B. MyMovie.avi und MyMovie.avi.mkv heißen.

Das folgende Skript sortiert alle Dateien mit demselben Präfix (MyMovie) in ein Verzeichnis, das wie das Präfix heißt. Dies ermöglicht einfaches Sortieren und Vergleichen dieser Dateien.

Andere Dateien werden nicht berührt. Die Operation wird nicht-rekursiv durchgeführt und keine Dateien werden überschrieben.

Beachten Sie, dass die Liste der Dateierweiterungen fest codiert ist und doppelte Erweiterungen wie .avi.mkv auch als Standarderweiterungen behandelt werden. Die Erweiterungsprüfung wird mit .endswith() durchgeführt.

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"
    ]

    # Add extensions such as ".avi.mp4" at the front
    # so we check them first
    extensions = [e1 + e2 for e1 in extensions for e2 in extensions] + extensions

    files_by_prefix = defaultdict(list)
    for file in os.listdir(directory):
        # Split 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 prefixes with only one file
    files_by_prefix = {k: v for k, v in files_by_prefix.items() if len(v) > 1}

    # Create directory for every prefix and move all the files into it
    for prefix, files in files_by_prefix.items():
        os.makedirs(os.path.join(directory, prefix), exist_ok=True)
        # Move file using if destination doesn't exist
        for file in files:
            print(f"{file} -> {prefix}/{file}")
            os.rename(os.path.join(directory, file), os.path.join(directory, prefix, file))

Check out similar posts by category: Python