Soubor a Adresář Srovnání s Python
07 Jan 2019
Python standardní knihovna nabízí výkonnou sadu nástrojů z krabice, včetně systému souborů manipulaci. V tomto krátkém článku uvidíte několik užitečných receptů pro porovnání souborů a adresářů s modulem filecmp.
když máte bolestivý nepořádek souborů a složek (jako zde nebo zde), které je obtížné orat, Python je váš přítel, který automatizuje vyhledávání a porovnávání. To pak může být kombinováno s automatickým zpracováním, úpravou nebo odstraněním souborů a adresářů namísto ručního procházení každého souboru.
spravedlivé varování: při úpravě systému souborů vždy zkontrolujte a otestujte kód pomocí jakékoli operace, jako je mazání, přejmenování, kopírování. A také uchovávat více kopií důležitých souborů „dva jsou jeden a jeden není žádný“.
v modulu filecmp
najdete funkci cmp()
, která může porovnávat dva soubory. Ve výchozím nastavení je porovnání mělké (shallow=True
), což znamená, že pouze os.stat () podpisy (jako velikost, datum změny, …) obou souborů jsou porovnány. Nastavením shallow=False
se porovnání provede porovnáním obsahu souborů, což zabere více času. Zde je úryvek můžete použít k najít všechny duplicitní položky ve složce:
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)
Zde můžete vidět využití dalších velmi užitečných modulů z Python standardní librar, modul itertools, který vám pomůže s různými iterátory a looping funkcí. V tomto případě můžete vidět funkci kombinace (), která vrací všechny permutace délky 2 seznamu souborů. Tím je zajištěno, že každý soubor je porovnán s každým jiným souborem v seznamu. Hledat rekurzivně přes všechny soubory ve složce, nahraďte files = os.listdir('...')
v předchozím kódu s:
files = for (dirpath, dirnames, filenames) in os.walk('.'): for f in filenames: files.append(os.path.join(dirpath, f))
můžete také porovnat adresáře s dircmp.třídy. Následující úryvek prochází dvě složky rekurzivně a zobrazí všechny soubory, které mají stejný název, ale jsou různé a uvádí všechny soubory, které existují buď na levé nebo pravé 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)
To je skvělý způsob, pokud máte více složek se stejným názvem, ale nemáte ponětí, pokud mají stejný obsah (jako jsou různé verze backup folder). Mějte na paměti, že se jedná pouze o mělké srovnání, jaké jste viděli v porovnání souborů dříve.