fil-og Katalogsammenligninger med Python

07 Jan 2019

Python-standardbiblioteket tilbyder et kraftfuldt sæt værktøjer ud af kassen inklusive filsystemhåndtering. I denne hurtige lille artikel vil du se et par nyttige opskrifter til at sammenligne filer og mapper med filecmp-modulet.

når du har et smertefuldt rod af filer og mapper (som her eller her), som er vanskelige at pløje igennem, er Python din ven til at automatisere søgningen og sammenligningen. Dette kan derefter kombineres med automatisk behandling, ændring eller sletning af filer og mapper i stedet for manuelt at gennemgå hver fil.

en retfærdig advarsel: kontroller og test altid koden korrekt, når du ændrer filsystemet med enhver handling som sletning, omdøbning, kopiering, blandt andre. Og også holde flere kopier af dine vigtige filer “To er en og en er ingen”.

i modulet filecmp finder du funktionen cmp(), som kan sammenligne to filer. Som standard er sammenligningen lav (shallow=True), hvilket betyder, at kun operativsystemet.stat () signaturer (som størrelse, dato ændret, …) af begge filer sammenlignes. Ved at indstille shallow=False foretages sammenligningen ved at sammenligne indholdet af filerne, hvilket tager mere tid. Her er et uddrag, du kan bruge til at finde alle dubletter i en mappe:

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)

her kan du se brugen af et andet meget nyttigt modul fra Python standard librar, itertools-modulet, som kan hjælpe dig med forskellige iteratorer og loopingfunktioner. I dette tilfælde kan du se funktionen kombinationer (), der returnerer alle permutationer af længde 2 på listen over filer. Dette sikrer, at hver fil sammenlignes med hinanden fil på listen. Hvis du vil søge rekursivt over alle filer i en mappe, skal du erstatte files = os.listdir('...') i den forrige kode med:

files = for (dirpath, dirnames, filenames) in os.walk('.'): for f in filenames: files.append(os.path.join(dirpath, f))

du kan også sammenligne mapper med dircmp-klassen. Følgende uddrag går rekursivt gennem to mapper og viser alle filer, der har samme navn, men er forskellige, og det viser alle filer, der findes enten til venstre eller højre filsti:

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)

dette er en fantastisk måde, hvis du har flere mapper med samme navn, men du aner ikke, om de har det samme indhold (som forskellige versioner af en sikkerhedskopimappe). Husk, at dette kun gør en lav sammenligning, som du så i filsammenligningen før.