Дубликаты файлов · Шаг 2 из 4
Отпечаток содержимого
Сравнивать два файла байт за байтом можно, но если в кучке десять файлов, сравнений сорок пять. Проще посчитать каждому отпечаток — SHA-256, шестьдесят четыре знака, которые у разного содержимого не совпадают на практике никогда. Файлы бывают по нескольку гигабайт, поэтому читать их надо кусками.
Что сделать
Посчитайте отпечаток SHA-256 содержимого файла, читая его кусками по 64 КБ, а не целиком.
Что приходит
fayl— файл, открытый на чтение байтов (open(…, "rb")илиio.BytesIO)
Что вернуть
Отпечаток — hexdigest() SHA-256, строка из 64 шестнадцатеричных знаков.
Допишите функцию otpechatok в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Утилита открывает каждый файл из кучек и зовёт otpechatok. Файлы с одинаковым отпечатком — копии друг друга.
io.BytesIO(b"abc") — файл в памяти из трёх байтов. Его отпечаток — "ba7816bf…15ad": это SHA-256 от b"abc", тот же, что дал бы файл на диске с таким содержимым.
import io
otpechatok(io.BytesIO(b"abc"))
'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'
Читать fayl.read(65536) (64 × 1024 байт), пока не вернётся пустое b"", и каждый кусок отдавать update одного и того же объекта hashlib.sha256(). Ответ — его hexdigest().
Файл целиком в память не читать: fayl.read() без размера на гигабайтном видео займёт гигабайт памяти.
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.