filecmp — Datei- und Verzeichnisvergleiche

Quellcode: Lib/filecmp.py


Das Modul filecmp definiert Funktionen zum Vergleichen von Dateien und Verzeichnissen mit verschiedenen optionalen Zeit-/Korrektheitskompromissen. Zum Vergleichen von Dateien siehe auch das Modul difflib.

Das Modul filecmp definiert die folgenden Funktionen

filecmp.cmp(f1, f2, shallow=True)

Vergleicht die Dateien mit den Namen f1 und f2 und gibt True zurück, wenn sie gleich zu sein scheinen, andernfalls False.

Wenn shallow wahr ist und die Signaturen von os.stat() (Dateityp, Größe und Änderungszeit) beider Dateien identisch sind, werden die Dateien als gleich betrachtet.

Andernfalls werden die Dateien als unterschiedlich behandelt, wenn ihre Größen oder Inhalte abweichen.

Beachten Sie, dass von dieser Funktion keine externen Programme aufgerufen werden, was sie portabel und effizient macht.

Diese Funktion verwendet einen Cache für frühere Vergleiche und deren Ergebnisse, wobei Cache-Einträge ungültig werden, wenn sich die os.stat()-Informationen für die Datei ändern. Der gesamte Cache kann mit clear_cache() geleert werden.

filecmp.cmpfiles(dir1, dir2, common, shallow=True)

Vergleicht die Dateien in den beiden Verzeichnissen dir1 und dir2, deren Namen durch common gegeben sind.

Gibt drei Listen von Dateinamen zurück: match, mismatch und errors. match enthält die Liste der Dateien, die übereinstimmen, mismatch enthält die Namen derjenigen, die nicht übereinstimmen, und errors listet die Namen der Dateien auf, die nicht verglichen werden konnten. Dateien werden in errors aufgeführt, wenn sie in einem der Verzeichnisse nicht existieren, der Benutzer keine Berechtigung zum Lesen hat oder der Vergleich aus irgendeinem anderen Grund nicht durchgeführt werden konnte.

Der Parameter shallow hat die gleiche Bedeutung und den gleichen Standardwert wie für filecmp.cmp().

Zum Beispiel vergleicht cmpfiles('a', 'b', ['c', 'd/e']) a/c mit b/c und a/d/e mit b/d/e. 'c' und 'd/e' werden jeweils in einer der drei zurückgegebenen Listen enthalten sein.

filecmp.clear_cache()

Leert den filecmp-Cache. Dies kann nützlich sein, wenn eine Datei so schnell nach ihrer Änderung verglichen wird, dass sie innerhalb der mtime-Auflösung des zugrunde liegenden Dateisystems liegt.

Hinzugefügt in Version 3.4.

Die Klasse dircmp

class filecmp.dircmp(a, b, ignore=None, hide=None, *, shallow=True)

Konstruiert ein neues Verzeichnisvergleichsobjekt zum Vergleichen der Verzeichnisse a und b. ignore ist eine Liste von Namen, die ignoriert werden sollen, und hat standardmäßig filecmp.DEFAULT_IGNORES. hide ist eine Liste von Namen, die versteckt werden sollen, und hat standardmäßig [os.curdir, os.pardir].

Die Klasse dircmp vergleicht Dateien standardmäßig mit flachen Vergleichen, wie für filecmp.cmp() beschrieben, unter Verwendung des Parameters shallow.

Geändert in Version 3.13: Der Parameter shallow wurde hinzugefügt.

Die Klasse dircmp bietet die folgenden Methoden

report()

Gibt (an sys.stdout) einen Vergleich zwischen a und b aus.

report_partial_closure()

Gibt einen Vergleich zwischen a und b sowie gemeinsamen unmittelbaren Unterverzeichnissen aus.

report_full_closure()

Gibt einen Vergleich zwischen a und b sowie gemeinsamen Unterverzeichnissen (rekursiv) aus.

Die Klasse dircmp bietet eine Reihe interessanter Attribute, die verwendet werden können, um verschiedene Informationen über die verglichenen Verzeichnisstrukturen zu erhalten.

Beachten Sie, dass über __getattr__()-Hooks alle Attribute verzögert berechnet werden, sodass es keine Geschwindigkeitsnachteile gibt, wenn nur Attribute verwendet werden, deren Berechnung leicht ist.

left

Das Verzeichnis a.

right

Das Verzeichnis b.

left_list

Dateien und Unterverzeichnisse in a, gefiltert nach hide und ignore.

right_list

Dateien und Unterverzeichnisse in b, gefiltert nach hide und ignore.

common

Dateien und Unterverzeichnisse in a und b.

left_only

Dateien und Unterverzeichnisse nur in a.

right_only

Dateien und Unterverzeichnisse nur in b.

common_dirs

Unterverzeichnisse in a und b.

common_files

Dateien in a und b.

common_funny

Namen in a und b, bei denen sich der Typ zwischen den Verzeichnissen unterscheidet, oder Namen, für die os.stat() einen Fehler meldet.

same_files

Dateien, die in a und b identisch sind, unter Verwendung des Datei-Vergleichsoperators der Klasse.

diff_files

Dateien, die sowohl in a als auch in b vorhanden sind und deren Inhalte gemäß dem Datei-Vergleichsoperator der Klasse abweichen.

funny_files

Dateien, die sowohl in a als auch in b vorhanden sind, aber nicht verglichen werden konnten.

subdirs

Ein Wörterbuch, das Namen aus common_dirs auf dircmp-Instanzen (oder MyDirCmp-Instanzen, wenn diese Instanz vom Typ MyDirCmp, einer Unterklasse von dircmp, ist) abbildet.

Geändert in Version 3.10: Früher waren Einträge immer dircmp-Instanzen. Jetzt sind Einträge vom gleichen Typ wie self, wenn self eine Unterklasse von dircmp ist.

filecmp.DEFAULT_IGNORES

Hinzugefügt in Version 3.4.

Liste der Verzeichnisse, die von dircmp standardmäßig ignoriert werden.

Hier ist ein vereinfachtes Beispiel für die Verwendung des Attributs subdirs, um rekursiv durch zwei Verzeichnisse zu suchen und gemeinsame unterschiedliche Dateien anzuzeigen.

>>> from filecmp import dircmp
>>> def print_diff_files(dcmp):
...     for name in dcmp.diff_files:
...         print("diff_file %s found in %s and %s" % (name, dcmp.left,
...               dcmp.right))
...     for sub_dcmp in dcmp.subdirs.values():
...         print_diff_files(sub_dcmp)
...
>>> dcmp = dircmp('dir1', 'dir2')
>>> print_diff_files(dcmp)