Python – Inhalt von zwei Verzeichnissen vergleichen

In diesem Blogbeitrag wird gezeigt, wie mit Python der Inhalt von zwei Verzeichnissen verglichen werden kann. Für dieses Beispiel habe ich zwei Verzeichnisse („Collection-A“ und „Collection-B“) erstellt, die Bilder enthalten. Der Inhalt dieser Ordner ist bis auf ein Bild identisch.

Beispiel 1

Für das Vergleichen des Inhalts von Ordnern gibt es das Modul filecmp, das Bestandteil von Pythons Standardbibliothek ist. Es muss über die Importanweisung importiert werden:

import filecmp

Der Code für das Vergleichen des Inhalts sieht dann folgendermaßen aus:

import filecmp

# Verzeichnisse definieren
first_dir = "/Users/bodo/Desktop/Collection-A"
second_dir = "/Users/bodo/Desktop/Collection-B"

# Vergleich der Dateien
comparison = filecmp.dircmp(first_dir, second_dir)

# Ergebis anzeigen
comparison.report()

Als Ergebnis erhalte ich folgende Information:

diff /Users/bodo/Desktop/Collection-A /Users/bodo/Desktop/Collection-B
Only in /Users/bodo/Desktop/Collection-B : ['E.png']
Identical files : ['A.jpeg', 'B.jpeg', 'C.jpeg', 'D.jpeg']

Beispiel 2

Der Code funktioniert, lässt sich aber noch verbessern. So wird er nicht auf Systemen funktionieren, bei denen das Home-Verzeichnis nicht „bodo“ heißt. Daher wird im folgenden Beispiel expanduser verwendet.

import filecmp

from os.path import expanduser

HOME_DIRECTORY = expanduser("~")

# Verzeichnisse definieren
first_dir = "/".join([HOME_DIRECTORY, "Desktop/Collection-A"])
second_dir = "/".join([HOME_DIRECTORY, "Desktop/Collection-B"])

# Vergleich der Dateien
comparison = filecmp.dircmp(first_dir, second_dir)

# Ergebis anzeigen
comparison.report()

An expanduser wird das Tilde-Zeichen (~) übergeben, das in der Shell für das eigene Benutzerverzeichnis steht. Mit join() wird das Home-Verzeichnis mit dem übrigen Pfad verknüpft. Es werden also die Pfade „~/Desktop/Collection-A“ bzw. „~/Desktop/Collection-B“ erstellt.

Beispiel 3

Der Code lässt sich noch weiter verbessern. Es ist denkbar, dass bei der Pfadangabe ein Fehler gemacht wird, was zu einem Traceback führt. Ändere ich den Verzeichnisnamen „Collection-A“

    first_dir = "/".join([HOME_DIRECTORY, "Desktop/Collection-A"])

zu „Collection_A“

    first_dir = "/".join([HOME_DIRECTORY, "Desktop/Collection_A"])

führt dies zu folgender Fehlermeldung (gekürzt):

[...]
self.left_list = _filter(os.listdir(self.left),
                             ^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/Users/bodo/Desktop/Collection_A'

Mit einer Ausnahmebehandlung lässt sich so ein Fehler abfangen:

try:
    # Vergleich der Dateien
    comparison = filecmp.dircmp(first_dir, second_dir)
    # Ergebnis anzeigen
    comparison.report()
except FileNotFoundError as ex:
    print(ex)

Als Fehlermeldung erscheint jetzt nur noch folgende Information:

[Errno 2] No such file or directory: '/Users/bodo/Desktop/Collection_A'

Fazit

Das letzte Beispiel ließe sich noch weiter verbessern, nichtsdestotrotz sollte deutlich geworden sein, dass sich das Vergleichen von Ordnerinhalten in Python aufgrund des Moduls filecmp sehr einfach realisieren lässt.