tiedosto-ja Hakemistovertailut Pythoniin

07.tammikuuta 2019

Python standard library tarjoaa tehokkaan joukon työkaluja, kuten tiedostojärjestelmän käsittelyn. Tässä lyhyessä artikkelissa näet pari hyödyllistä reseptiä tiedostojen ja hakemistojen vertailemiseksi filecmp-moduulin kanssa.

kun sinulla on tuskainen sotku tiedostoja ja kansioita (kuten täällä, tai täällä), joiden läpi on vaikea kyntää, Python on ystäväsi automatisoimaan hakua ja vertailua. Tämä voidaan sitten yhdistää automaattiseen käsittelyyn, muokkaamiseen tai tiedostojen ja hakemistojen poistamiseen sen sijaan, että jokainen tiedosto käytäisiin manuaalisesti läpi.

reilu varoitus: tarkista ja testaa koodi aina oikein muokattaessa tiedostojärjestelmää millä tahansa toiminnolla, kuten poistamalla, uudelleennimeämällä, kopioimalla, mm. Ja myös pitää useita kopioita tärkeitä tiedostoja ”kaksi on yksi ja yksi ei ole”.

filecmp – moduulista löytyy cmp() – funktio, jolla voi vertailla kahta tiedostoa. Oletuksena vertailukohta on matala (shallow=True), mikä tarkoittaa, että vain käyttöjärjestelmä.stat () allekirjoituksia (kuten koko, päivämäärä muutettu,…) molempien tiedostojen verrataan. Asettamalla shallow=False vertailu tehdään vertaamalla tiedostojen sisältöä, mikä vie enemmän aikaa. Tässä on pätkä, jonka avulla voit löytää kaikki kaksoiskappaleet kansiosta:

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)

tässä näet toisen erittäin hyödyllisen moduulin käytön Python standard librarista, itertools-moduulin, joka voi auttaa sinua erilaisten iteraattoreiden ja silmukkatoimintojen kanssa. Tässä tapauksessa voit nähdä yhdistelmät () funktio, joka palauttaa kaikki permutaatiot pituus 2 tiedostoluettelosta. Tämä varmistaa, että jokaista tiedostoa verrataan toisiinsa luettelossa. Etsiäksesi rekursiivisesti kaikkia kansion tiedostoja, korvaa files = os.listdir('...') edellisessä koodissa:

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

dircmp-luokan kanssa voi myös vertailla hakemistoja. Seuraava pätkä käy läpi kaksi kansiota rekursiivisesti ja näyttää kaikki tiedostot, joilla on sama nimi, mutta ovat erilaisia ja se listaa kaikki tiedostot, jotka ovat olemassa joko vasemmalla tai oikealla filepath:

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)

tämä on hyvä tapa, jos sinulla on useita kansioita, joilla on sama nimi, mutta sinulla ei ole aavistustakaan, jos niillä on sama sisältö (kuten eri versioita varmuuskopiokansiosta). Muista, että tämä tekee vain pinnallinen vertailua kuten näit tiedoston vertailu ennen.