Fil Og Katalog Sammenligninger Med Python
07 Jan 2019
Python standard library tilbyr et kraftig sett med verktøy ut av boksen, inkludert filsystem håndtering. I denne raske lille artikkelen ser du et par nyttige oppskrifter for å sammenligne filer og kataloger med filecmp-modulen.
når du har et smertefullt rot av filer og mapper (som her eller her), som er vanskelig å pløye gjennom, Er Python din venn for å automatisere søket og sammenligningen. Dette kan da kombineres med automatisk behandling, endring eller sletting av filer og kataloger i stedet for manuelt å gå gjennom hver fil.
en rettferdig advarsel: sjekk alltid og test koden riktig når du endrer filsystemet med en hvilken som helst operasjon som å slette, omdøpe, kopiere, blant andre. Og også holde flere kopier av viktige filer «To Er En og En Er Ingen».
i modulen filecmp
finner du funksjonen cmp()
som kan sammenligne to filer. Som standard sammenligningen er grunne (shallow=True
) som betyr at bare os.stat () signaturer (som størrelse, dato endret, …) av begge filene sammenlignes. Ved å sette shallow=False
sammenligningen gjøres ved å sammenligne innholdet i filene, som tar mer tid. Her er en utdrag du kan bruke til å finne alle duplikater 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 bruken av en annen svært nyttig modul Fra Python standard librar, itertools modulen, som kan hjelpe deg med ulike iteratorer og looping funksjoner. I dette tilfellet kan du se kombinasjonene () – funksjonen som returnerer alle permutasjoner av lengde 2 i listen over filer. Dette gjør at hver fil er sammenlignet med hverandre fil i listen. For å søke rekursivt over alle filer i en mappe, erstatt files = os.listdir('...')
i 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 kataloger med dircmp klasse. Følgende utdrag går gjennom to mapper rekursivt og viser alle filer som har samme navn, men er forskjellige, og det viser alle filer som finnes enten på venstre eller høyre filbane:
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 fin måte hvis du har flere mapper med samme navn, men du aner ikke om de har samme innhold (som forskjellige versjoner av en sikkerhetskopimappe). Husk at dette bare gjør en grunne sammenligning som du så i filsammenligningen før.