Дубликаты файлов · Шаг 3 из 4
Одинаковые по содержимому
Кучки одинакового размера есть, отпечаток считать умеем. Осталось внутри каждой кучки разложить файлы по отпечаткам. Одна беда: на настоящем диске файл может не открыться — нет прав или его удалили, пока утилита шла по папке. Из-за одного такого файла отчёт не должен пропадать целиком.
Что сделать
Внутри каждой кучки одного размера найдите файлы с одинаковым отпечатком; непрочитанные — в отдельный список.
Что приходит
kuchki— список кучек путей из шага 1otpechatok_fayla— функция «путь → отпечаток»; если файл не прочитать, бросаетOSError
Что вернуть
Пару (группы, не_прочитаны): группы — списки путей с одинаковым отпечатком, не меньше двух в каждой; не_прочитаны — пути, на которых был OSError.
Допишите функцию odinakovye в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Утилита передаёт сюда кучки из шага 1 и функцию, которая открывает файл и зовёт ваш шаг 2. Что вы вернули, уйдёт в отчёт — шаг 4.
В проверке отпечатки лежат в словаре: у a.jpg и b.jpg — "f00", у c.jpg — "bad". Кучка ["a.jpg", "b.jpg", "c.jpg"] даёт одну группу копий ["a.jpg", "b.jpg"], непрочитанных нет: ([["a.jpg", "b.jpg"]], []).
Каждая кучка разбирается отдельно. Для каждого пути — один вызов otpechatok_fayla(путь).
OSError (и его наследники: PermissionError, FileNotFoundError…) — путь уходит в список непрочитанных, и разбор идёт дальше. Другие исключения не ловить: это ошибка в коде, её надо видеть.
Пути одной кучки с одинаковым отпечатком — одна группа, если их больше одного. Порядок: группы — в порядке кучек, а внутри кучки — в порядке первого пути группы; пути в группе и непрочитанные — в том порядке, в каком встретились.
Образцовый тест целиком
otpechatki = {"a.jpg": "f00", "b.jpg": "f00", "c.jpg": "bad"}
otpechatok = lambda put: otpechatki[put]
odinakovye([["a.jpg", "b.jpg", "c.jpg"]], otpechatok)
([['a.jpg', 'b.jpg']], [])
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.