fil-och Katalogjämförelser med Python
07 Jan 2019
Python standard library erbjuder en kraftfull uppsättning verktyg ur lådan inklusive filsystemhantering. I den här snabba lilla artikeln ser du ett par användbara recept för att jämföra filer och kataloger med filecmp-modulen.
när du har en smärtsam röra av filer och mappar (som här eller här), som är svåra att plöja igenom, är Python din vän för att automatisera sökningen och jämförelsen. Detta kan sedan kombineras med automatisk bearbetning, modifiering eller radering av filer och kataloger istället för att manuellt gå igenom varje fil.
en rättvis varning: Kontrollera alltid och testa koden ordentligt när du ändrar filsystemet med alla åtgärder som att radera, byta namn, kopiera, bland andra. Och behåll också flera kopior av dina viktiga filer ”två är en och en är ingen”.
i modulen filecmp
hittar du funktionen cmp()
som kan jämföra två filer. Som standard jämförelsen är grunt (shallow=True
) vilket innebär att endast os.stat () signaturer (som storlek, datum ändrat, …) av båda filerna jämförs. Genom att ställa in shallow=False
görs jämförelsen genom att jämföra innehållet i filerna, vilket tar längre tid. Här är ett utdrag som du kan använda för att hitta alla dubbletter i en mapp:
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)
här kan du se användningen av en annan mycket användbar modul från Python-standardbiblioteket, itertools-modulen, som kan hjälpa dig med olika iteratorer och loopningsfunktioner. I det här fallet kan du se funktionen combinations () som returnerar alla permutationer av längd 2 i listan över filer. Detta säkerställer att varje fil jämförs med varandra fil i listan. För att söka rekursivt över alla filer i en mapp, ersätt files = os.listdir('...')
i föregående kod med:
files = for (dirpath, dirnames, filenames) in os.walk('.'): for f in filenames: files.append(os.path.join(dirpath, f))
du kan också jämföra kataloger med dircmp-klassen. Följande utdrag går igenom två mappar rekursivt och visar alla filer som har samma namn, men är olika och det listar alla filer som finns antingen på vänster eller höger filsökväg:
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)
det här är ett bra sätt om du har flera mappar med samma namn men du har ingen aning om de har samma innehåll (som olika versioner av en säkerhetskopieringsmapp). Tänk på att detta bara gör en grund jämförelse som du såg i filjämförelsen tidigare.