vergelijkingen van bestanden en mappen met Python
07 Jan 2019
de Python standaardbibliotheek biedt een krachtige set van tools uit de doos inclusief bestandssysteem handling. In dit snelle kleine artikel ziet u een paar nuttige recepten om bestanden en mappen te vergelijken met de filecmp-module.
wanneer u een pijnlijke puinhoop van bestanden en mappen (zoals hier, of hier), die moeilijk zijn om door te ploegen, Python is uw vriend om het zoeken en vergelijken te automatiseren. Dit kan dan worden gecombineerd met automatische verwerking, wijziging of verwijdering van bestanden en mappen in plaats van handmatig gaan door elk bestand.
een eerlijke waarschuwing: controleer en test de code altijd correct bij het wijzigen van het bestandssysteem met een bewerking zoals Verwijderen, hernoemen, kopiëren, onder andere. En houd ook meerdere kopieën van uw belangrijke bestanden “twee is één en één is geen”.
In de module filecmp
vindt u de functie cmp()
die twee bestanden kan vergelijken. Standaard is de vergelijking ondiep (shallow=True
), wat betekent dat alleen het besturingssysteem.stat () handtekeningen (zoals grootte, datum gewijzigd,…) van beide bestanden worden vergeleken. Door shallow=False
in te stellen wordt de vergelijking gedaan door de inhoud van de bestanden te vergelijken, wat meer tijd in beslag neemt. Hier is een knipsel dat u kunt gebruiken om alle duplicaten in een map te vinden:
import osimport itertoolsimport filecmpfiles = os.listdir('path/to/directory')for f1, f2 in itertools.combinations(files, 2): if filecmp.cmp(f1, f2): print(f1, f2)
hier zie je het gebruik van een andere zeer nuttige module uit de Python standaard librar, de itertools module, die je kan helpen met verschillende iterators en looping functies. In dit geval kunt u de functie combinations() zien die alle permutaties van lengte 2 van de lijst met bestanden retourneert. Dit zorgt ervoor dat elk bestand wordt vergeleken met elk ander bestand in de lijst. Om recursief te zoeken over alle bestanden in een map, vervang files = os.listdir('...')
in de vorige code door:
files = for (dirpath, dirnames, filenames) in os.walk('.'): for f in filenames: files.append(os.path.join(dirpath, f))
u kunt ook mappen vergelijken met de dircmp klasse. Het volgende fragment gaat door twee mappen recursief en toont alle bestanden die dezelfde naam hebben, maar zijn verschillend en het toont alle bestanden die bestaan aan de linker of rechter bestandspad:
import filecmpc = filecmp.dircmp(filepath1, filepath2)def report_recursive(dcmp): for name in dcmp.diff_files: print("DIFF file %s found in %s and %s" % (name, dcmp.left, dcmp.right)) for name in dcmp.left_only: print("ONLY LEFT file %s found in %s" % (name, dcmp.left)) for name in dcmp.right_only: print("ONLY RIGHT file %s found in %s" % (name, dcmp.right)) for sub_dcmp in dcmp.subdirs.values(): print_diff_files(sub_dcmp)report_recursive(c)
Dit is een geweldige manier als u meerdere mappen met dezelfde naam, maar je hebt geen idee of ze dezelfde inhoud hebben (zoals verschillende versies van een back-up map). Houd er rekening mee dat dit alleen een oppervlakkige vergelijking doet zoals je eerder in de bestandsvergelijking zag.