filecmp — File and Directory Comparisons¶
Вихідний код: Lib/filecmp.py
Модуль filecmp визначає функції для порівняння файлів і каталогів із різними необов’язковими компромісами між часом і правильністю. Для порівняння файлів див. також модуль difflib.
Модуль filecmp визначає такі функції:
- filecmp.cmp(f1, f2, shallow=True)¶
Порівняйте файли з іменами f1 і f2, повертаючи
True, якщо вони здаються однаковими,Falseінакше.Якщо shallow має значення true і сигнатури
os.stat()(тип файлу, розмір і час модифікації) обох файлів ідентичні, файли вважаються однаковими.В іншому випадку файли розглядаються як різні, якщо їхні розміри або вміст відрізняються.
Зауважте, що жодні зовнішні програми не викликаються з цієї функції, що забезпечує її переносимість та ефективність.
Ця функція використовує кеш для попередніх порівнянь і результатів, при цьому записи кешу стають недійсними, якщо інформація
os.stat()для файлу змінюється. Весь кеш можна очистити за допомогоюclear_cache().
- filecmp.cmpfiles(dir1, dir2, common, shallow=True)¶
Порівняйте файли у двох каталогах dir1 і dir2, імена яких задані common.
Повертає три списки імен файлів: збіг, невідповідність, помилки. match містить список файлів, які збігаються, mismatch містить імена тих, які не відповідають, а errors містить імена файлів, які не вдалося порівняти. Файли перераховуються в помилках, якщо вони не існують в одному з каталогів, у користувача немає дозволу на їх читання або якщо порівняння не вдалося виконати з іншої причини.
Параметр shallow має те саме значення та значення за замовчуванням, що й для
filecmp.cmp().Наприклад,
cmpfiles('a', 'b', ['c', 'd/e'])порівнюєa/cзb/cіa /d/eзb/d/e.'c'і'd/e'будуть кожен в одному з трьох повернутих списків.
- filecmp.clear_cache()¶
Очистіть кеш filecmp. Це може бути корисним, якщо файл порівнюється настільки швидко після його модифікації, що він знаходиться в межах дозволу mtime основної файлової системи.
Нове в версії 3.4.
Клас dircmp¶
- class filecmp.dircmp(a, b, ignore=None, hide=None)¶
Construct a new directory comparison object, to compare the directories a and b. ignore is a list of names to ignore, and defaults to
filecmp.DEFAULT_IGNORES. hide is a list of names to hide, and defaults to[os.curdir, os.pardir].The
dircmpclass compares files by doing shallow comparisons as described forfilecmp.cmp().Клас
dircmpнадає такі методи:- report()¶
Вивести (у
sys.stdout) порівняння між a і b.
- report_partial_closure()¶
Надрукуйте порівняння між a і b та загальними безпосередніми підкаталогами.
- report_full_closure()¶
Вивести порівняння між a і b та загальними підкаталогами (рекурсивно).
Клас
dircmpпропонує низку цікавих атрибутів, які можна використовувати для отримання різноманітної інформації про порівнювані дерева каталогів.Note that via
__getattr__()hooks, all attributes are computed lazily, so there is no speed penalty if only those attributes which are lightweight to compute are used.- left¶
Каталог a.
- right¶
Каталог b.
- left_list¶
Файли та підкаталоги в a, відфільтровані за допомогою hide та ignore.
- right_list¶
Файли та підкаталоги в b, відфільтровані за допомогою hide та ignore.
- common¶
Файли та підкаталоги в a і b.
- left_only¶
Файли та підкаталоги лише в a.
- right_only¶
Файли та підкаталоги лише в b.
- common_dirs¶
Підкаталоги в a і b.
- common_files¶
Файли в a і b.
- common_funny¶
Імена як у a, так і в b, типи яких відрізняються в різних каталогах, або імена, для яких
os.stat()повідомляє про помилку.
- same_files¶
Файли, ідентичні як у a, так і в b, використовуючи оператор порівняння файлів класу.
- diff_files¶
Файли, які містяться як у a, так і в b, вміст яких відрізняється відповідно до оператора порівняння файлів класу.
- funny_files¶
Файли, які знаходяться як у a, так і в b, але не можна порівняти.
- subdirs¶
Словник, що відображає імена в
common_dirsна екземпляриdircmp(або екземпляри MyDirCmp, якщо цей екземпляр має тип MyDirCmp, підкласdircmp).
Ось спрощений приклад використання атрибута subdirs для рекурсивного пошуку в двох каталогах, щоб показати спільні різні файли:
>>> from filecmp import dircmp
>>> def print_diff_files(dcmp):
... for name in dcmp.diff_files:
... print("diff_file %s found in %s and %s" % (name, dcmp.left,
... dcmp.right))
... for sub_dcmp in dcmp.subdirs.values():
... print_diff_files(sub_dcmp)
...
>>> dcmp = dircmp('dir1', 'dir2')
>>> print_diff_files(dcmp)