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¶ A dictionary mapping names in
common_dirstodircmpobjects.
-
Ось спрощений приклад використання атрибута 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)