filecmp.dircmp
ist der richtige Weg. Aber es vergleicht nicht den Inhalt von Dateien, die sich mit dem gleichen Pfad in zwei verglichenen Verzeichnissen befinden. Stattdessen betrachtet filecmp.dircmp
nur Dateiattribute. Da dircmp
eine Klasse ist, können Sie dies mit einer dircmp
-Unterklasse beheben und ihre phase3
-Funktion überschreiben, die Dateien vergleicht, um sicherzustellen, dass der Inhalt verglichen wird, anstatt nur os.stat
-Attribute zu vergleichen.
import filecmp
class dircmp(filecmp.dircmp):
"""
Vergleicht den Inhalt von dir1 und dir2. Im Gegensatz zu filecmp.dircmp vergleicht diese Unterklasse den Inhalt von Dateien mit dem gleichen Pfad.
"""
def phase3(self):
"""
Finde Unterschiede zwischen gemeinsamen Dateien.
Stelle sicher, dass wir den Inhalt mit shallow=False vergleichen.
"""
fcomp = filecmp.cmpfiles(self.left, self.right, self.common_files,
shallow=False)
self.same_files, self.diff_files, self.funny_files = fcomp
Dann können Sie dies verwenden, um einen Boolean zurückzugeben:
import os.path
def is_same(dir1, dir2):
"""
Vergleicht den Inhalt von zwei Verzeichnisbaumstrukturen.
Gibt False zurück, wenn sie sich unterscheiden, True, wenn sie identisch sind.
"""
compared = dircmp(dir1, dir2)
if (compared.left_only or compared.right_only or compared.diff_files
or compared.funny_files):
return False
for subdir in compared.common_dirs:
if not is_same(os.path.join(dir1, subdir), os.path.join(dir2, subdir)):
return False
return True
Falls Sie diesen Code-Auszug wiederverwenden möchten, wird er hiermit in die Public Domain oder die Creative Commons CC0 nach Ihrer Wahl gewidmet (zusätzlich zur Standardlizenz CC-BY-SA von SO).
0 Stimmen
Was ist "AFIAC"? Kann es nicht in einem gängigen Akronym finden, wenn gesucht wird.
0 Stimmen
@LondonAppDev Meine Vermutung ist, dass der Autor AFAIC gemeint hat (so weit ich das beurteilen kann (z.B. oxfordlearnersdictionaries.com/us/definition/english/…)), aber es möglicherweise als AFIAC falsch geschrieben hat. Eng verwandt mit AFAIK, d.h. so weit ich weiß.