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.