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 dircmp class compares files by doing shallow comparisons as described for filecmp.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

A dictionary mapping names in common_dirs to dircmp objects.

filecmp.DEFAULT_IGNORES

Нове в версії 3.4.

Список каталогів, які 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)