Я хотел использовать простой скрипт, чтобы получить все изображения ниже данной папки и сравнить их / найти дубликаты.
Зачем изобретать колесо, если первый шаг решения уже существует в разделе: Поиск дубликатов файлы и их удаление
Но он терпит неудачу уже на первом этапе в том смысле, что посещает все папки на данном USB-накопителе. Я удалил все хеширование и пытаюсь получить только список файлов, но даже это длится вечно и посещает каждый файл на USB-накопителе.
from __future__ import print_function # py2 compatibility
from collections import defaultdict
import hashlib
import os
import sys
folder_to_check = "D:\FileCompareTest"
def check_for_duplicates(paths, hash=hashlib.sha1):
hashes_by_size = defaultdict(list) # dict of size_in_bytes: [full_path_to_file1, full_path_to_file2, ]
hashes_on_1k = defaultdict(list) # dict of (hash1k, size_in_bytes): [full_path_to_file1, full_path_to_file2, ]
hashes_full = {} # dict of full_file_hash: full_path_to_file_string
for path in paths:
for dirpath, dirnames, filenames in os.walk(path):
# get all files that have the same size - they are the collision candidates
for filename in filenames:
full_path = os.path.join(dirpath, filename)
try:
# if the target is a symlink (soft one), this will
# dereference it - change the value to the actual target file
full_path = os.path.realpath(full_path)
file_size = os.path.getsize(full_path)
hashes_by_size[file_size].append(full_path)
except (OSError,):
# not accessible (permissions, etc) - pass on
continue
check_for_duplicates(folder_to_check)
Вместо того, чтобы получить список hashes_by_size за пару миллисекунд, я застреваю либо в вечном цикле, либо программа завершается через несколько часов со всеми файлами на USB.
Что я не понимаю в os.walk ()?
Значит, я не могу ограничить os.walk переходом только под определенную папку? мне трудно в это поверить — person rioZg schedule 03.02.2021
Вы можете найти подробную информацию о том, как os.walk
работает на странице документации. https://docs.python.org/3/library/os.html#os.walk. — person rioZg schedule 03.02.2021
Вам следует позвонить
То, как вы зовете, вы получаете генераторы на каждого персонажа на вашем пути, а не на вашем правильном пути.
Ух ты. Благодаря тонну. Вот и все. Я бы не придумал это самостоятельно. Мне нужно подождать еще 6 минут, чтобы принять ответ. — person rioZg; 03.02.2021