fájl-és könyvtár-összehasonlítás a Pythonnal

07 Jan 2019

a Python standard könyvtár hatékony eszközkészletet kínál a dobozból, beleértve a fájlrendszer kezelését is. Ebben a rövid kis cikkben néhány hasznos receptet talál a fájlok és könyvtárak összehasonlításához a filecmp modullal.

ha fájdalmas rendetlenség van a fájlok és mappák között (például itt vagy itt), amelyeket nehéz átvágni, a Python a barátod, hogy automatizálja a keresést és az összehasonlítást. Ez kombinálható a fájlok és könyvtárak automatikus feldolgozásával, módosításával vagy törlésével, ahelyett, hogy manuálisan átmenne az egyes fájlokon.

tisztességes figyelmeztetés: mindig ellenőrizze és tesztelje a kódot megfelelően, amikor a fájlrendszert módosítja bármilyen művelettel, például törléssel, átnevezéssel, másolással. Tartsa meg a fontos fájlok több példányát is: “kettő egy, az egyik pedig nincs”.

a filecmp modulban megtalálja a cmp() függvényt, amely két fájlt képes összehasonlítani. Alapértelmezés szerint az összehasonlítás sekély (shallow=True), ami azt jelenti, hogy csak az operációs rendszer.stat() aláírások (mint a méret, dátum módosított, …) mindkét fájlt összehasonlítjuk. A shallow=False beállítással az összehasonlítás a fájlok tartalmának összehasonlításával történik, ami több időt vesz igénybe. Itt van egy részlet, amellyel megtalálhatja az összes másolatot egy mappában:

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)

itt látható egy másik nagyon hasznos modul használata a Python standard librar-ból, az itertools modul, amely segíthet a különböző iterátorokban és hurkolási funkciókban. Ebben az esetben láthatjuk a kombinációk() függvény, amely visszaadja az összes permutációk hossza 2 a fájlok listáját. Ez biztosítja, hogy az egyes fájlokat összehasonlítsák a listában szereplő fájlokkal. A mappában található összes fájl rekurzív kereséséhez cserélje le az előző kód files = os.listdir('...') értékét a következőre::

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

összehasonlíthatja a könyvtárakat a dircmp osztályával is. A következő kódrészlet két mappán megy keresztül rekurzív módon, és megjeleníti az összes azonos nevű, de eltérő fájlt, és felsorolja a bal vagy a jobb oldali fájlútvonalon létező összes fájlt:

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)

ez nagyszerű módja annak, ha több mappája van ugyanazzal a névvel, de fogalma sincs arról, hogy ugyanaz a tartalom van-e (például a biztonsági mentési mappa különböző verziói). Ne feledje, hogy ez csak egy sekély összehasonlítást tesz lehetővé, mint amit korábban a fájl-összehasonlításban látott.