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.