filecmp — File and Directory Comparisons

Вихідний код: Lib/filecmp.py


Модуль filecmp визначає функції для порівняння файлів і каталогів із різними необов’язковими компромісами між часом і правильністю. Для порівняння файлів див. також модуль difflib.

Модуль filecmp визначає такі функції:

filecmp.cmp(f1, f2, shallow=True)

Порівняйте файли з іменами f1 і f2, повертаючи True, якщо вони здаються однаковими, False інакше.

If shallow is true, files with identical os.stat() signatures are taken to be equal. Otherwise, the contents of the files are compared.

Зауважте, що жодні зовнішні програми не викликаються з цієї функції, що забезпечує її переносимість та ефективність.

Ця функція використовує кеш для попередніх порівнянь і результатів, при цьому записи кешу стають недійсними, якщо інформація 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)