import filecmp filecmp.cmpfiles(dir1, dir2, common, shallow=True)
dir1
, dir2
- имена директорий с общими файлами,common
- список имен сравниваемых файлов,shallow=True
- сравнивать содержимое файлов.Функция cmpfiles()
модуля filecmp
сравнивает файлы в двух каталогах dir1
и dir2
, список имен которых переданы аргументу common
.
Возвращает кортеж из трех списков имен файлов (match, mismatch, errors)
:
match
содержит список файлов, которые совпадают, mismatch
содержит имена тех, которые не совпадают, errors
содержат имена файлов, которые нельзя сравнивать. Файлы отображаются в списке error
если их нет в одном из каталогов, у пользователя нет разрешения на их чтение или если сравнение не может быть выполнено по какой-либо другой причине.
Параметр shallow
имеет то же значение и значение по умолчанию, что и для функции filecmp.cmp()
.
Например вызов filecmp.cmpfiles('a', 'b', ['c', 'd/e'])
будет сравнивать a/c
с b/c
и a/d/e
c b/d/e
. Файлы 'c'
и 'd/e'
будут в каждом из трех возвращенных списков.
import filecmp, os # преобразовываем списки файлов # каталогов dir1 и dir2 в множества file_dir1 = set(os.listdir('path/to/dir1')) file_dir1 = set(os.listdir('path/to/dir2')) # находим пересечение множеств, тем # самым получаем общие имена common = list(file_dir1 & file_dir2) # Теперь проверяем список common # на файлы, чтобы не попался каталог common_files = [ file_name for file_name in common if os.path.isfile(os.path.join('path/to/dir1', file_name)) ] # Сравниваем общие файлы 2-х каталогов match, mismatch, errors = filecmp.cmpfiles( 'path/to/dir1', 'path/to/dir2', common_files, ) >>> common_files # ['contents_differ', 'file_in_dir1', 'common_file'] >>> match # ['common_file'] >>> mismatch # ['contents_differ', 'file_in_dir1'] >>> errors # []