# `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

    Словник, що відображає імена в `common_dirs` на екземпляри `dircmp` (або екземпляри MyDirCmp, якщо цей екземпляр має тип MyDirCmp, підклас `dircmp`).

    Змінено в версії 3.10: Раніше записи завжди були екземплярами `dircmp`. Тепер записи того самого типу, що й self, якщо self є підкласом `dircmp`.

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)