Я стараюсь избегать дубликатов в моей mp3-коллекции (довольно большой). Я хочу проверить дубликаты, проверяя содержимое файла, вместо того, чтобы искать то же имя файла. Для этого я написал код ниже, но через минуту он выдает MemoryError. Любые предложения о том, как я могу заставить это работать?Как найти дубликаты файлов в большой файловой системе, избегая MemoryError
import os
import hashlib
walk = os.walk('H:\MUSIC NEXT GEN')
mySet = set()
dupe = []
hasher = hashlib.md5()
for dirpath, subdirs, files in walk:
for f in files:
fileName = os.path.join(dirpath, f)
with open(fileName, 'rb') as mp3:
buf = mp3.read()
hasher.update(buf)
hashKey = hasher.hexdigest()
print hashKey
if hashKey in mySet:
dupe.append(fileName)
else:
mySet.add(hashKey)
print 'Dupes: ' + str(dupe)
Использование базы данных и сохранение имени файла в поле первичного ключа может быть одним из способов сделать это –
Вопрос в том, имеет ли MemoryError во время ходьбы файловой системы или когда вы пытаетесь создать строку из 'dupe'? Вместо этого вы можете попробовать «для имени в обмане: напечатать имя». Или, что еще лучше, выведите дубликаты, как вы их находите, а не храните их до конца. – chepner
вместо 'mp3.read()' читать в небольших кусках, скажем 1 мега. – tdelaney