comparații de fișiere și directoare cu Python

07 Jan 2019

biblioteca standard Python oferă un set puternic de instrumente din cutie, inclusiv manipularea sistemului de fișiere. În acest mic articol rapid veți vedea câteva rețete utile pentru a compara fișierele și directoarele cu modulul filecmp.

când aveți o mizerie dureroasă de fișiere și foldere (cum ar fi aici sau aici), care sunt dificil de arat, Python este prietenul dvs. pentru a automatiza căutarea și compararea. Acest lucru poate fi apoi combinat cu procesarea automată, modificarea sau ștergerea fișierelor și directoarelor în loc să parcurgeți manual fiecare fișier.

un avertisment corect: verificați și testați întotdeauna codul corect atunci când modificați sistemul de fișiere cu orice operație precum ștergerea, redenumirea, copierea, printre altele. Și, de asemenea, să păstreze mai multe copii ale fișierelor importante „doi este unul și unul este nici unul”.

în modulul filecmp veți găsi funcția cmp() care poate compara două fișiere. În mod implicit, comparația este superficială (shallow=True), ceea ce înseamnă că numai sistemul de operare.stat () semnături (cum ar fi dimensiunea, data modificată, …) din ambele fișiere sunt comparate. Prin setarea shallow=False comparația se face prin compararea conținutului fișierelor, ceea ce necesită mai mult timp. Iată un fragment pe care îl puteți utiliza pentru a găsi toate duplicatele dintr-un folder:

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)

aici puteți vedea utilizarea unui alt modul extrem de util din Python standard librar, modulul itertools, care vă poate ajuta cu diverse iteratoare și funcții de buclă. În acest caz, puteți vedea funcția combinations() care returnează toate permutările de lungime 2 din lista de fișiere. Acest lucru face sigur că fiecare fișier este comparat cu fiecare alt fișier în listă. Pentru a căuta recursiv peste toate fișierele dintr-un folder, înlocuiți files = os.listdir('...') din codul anterior cu:

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

de asemenea, puteți compara directoarele cu clasa dircmp. Următorul fragment trece prin două foldere recursiv și afișează toate fișierele care au același nume, dar sunt diferite și listează toate fișierele care există fie pe filepath stânga sau dreapta:

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)

aceasta este o modalitate excelentă dacă aveți mai multe foldere cu același nume, dar nu aveți idee dacă au același conținut (cum ar fi versiuni diferite ale unui folder de rezervă). Rețineți că acest lucru face doar o comparație superficială așa cum ați văzut în comparația fișierelor înainte.