Python: Search for analogs(md5)

Posted by Nosaer | Posted in

   Столкнулся с тем, что на винчестере папка "Учеба" занимает несколько десятков гигабайт различных файлов. Причем половина из них одинаковые и разбросаны как попало. В итоге был написан скрипт, который ищет одинаковый файлы на компьютере. Для определения сходства, находим md5 сумму каждого файла с последующим сравниванием их.
   На данный момент так скажем есть несколько проблем:
1) Не открывает системные файлы
2) Не работает со слишком большим объемом данных, т.е. все хеши и пути к файлам держатся в уме до завершения работы программы, без какой либо записи в файл
     Для настройки работы нужно указать всего 2 параметра.
dname, slash, rash= r"С:/", "*/", "*"
dname - путь к папке, откуда нужно начинать поиск
rash - имя и расширение файла
   В Blogger при размещении постов возникли небольшие проблемы с табуляцией, поэтому каждый знак табуляции заменен на три пробела.
# -*- coding: utf-8 -*-
import hashlib, glob, os, copy
x, y, i, lens = 0, 4, 0, 1
dname, slash, rash= r"С:/", "*/", "*"
s, h = [], []
def hash(put): #Функция для хеширования файлов
try:
file = open(put, "r+")
buf = file.read()
file.close()
md5 = hashlib.md5(buf)
md5hex = md5.hexdigest()
s.append(md5hex)
s.append(put)
except IOError as e:
pass
def analog(h): #Функция для поиска одинаковых файлов
while 1:
rem_index = raw_input("Enter the index file to remove or enter ""Exit"" to exit: ")
if rem_index == "Exit":
break
else:
rem_index = int(rem_index)
os.remove(h[rem_index])
while x < y: #Цикл для поиска файлов
putc = dname+"*."+rash
list = glob.glob(putc)
x = x+1
dname = dname + slash
lenlist = len(list)
while lenlist != 0:
put = list[0]
hash(put)
del list[0]
lenlist = lenlist - 1
#Записываем в лог все найденые файлы и их md5 сумму.
t = copy.deepcopy(s)
log = open(r"C:\log.txt", "w")
try:
while lens !=0:
log.write(t[0]+"\n")
del t[0]
lens = len(t)
log.close()
except IndexError as e:
pass
z = len(s) // 2
while z > 0: #Цикл поиска одинаковых файлов
smd5 = s[0]
sput = s[1]
del s[1], s[0]
numb = s.count(smd5) #Проверяем количество вхождений
if numb == 0:
pass
else:
while numb != 0: #Заносим одинаковые файлы в список h
index = s.index(smd5) # Получаем индекс
index1 = index+1
h.append(sput)
h.append(s[index1])
print "Coincidence:\n"+str(i)+":"+sput+"\n"+str(i+1)+":"+s[index1]
del s[index1], s[index]
numb = numb - 1
i = i+2
z = len(s) // 2
#Запрашиваем какие файлы удалять
try:
analog(h)
except IndexError as e:
print "The index value is incorrect"
analog(h)
except ValueError as e:
print "The value is incorrect"
analog(h)
except MemoryError as e:
print "Not enough memory, the amount of data too large"
print "Work completed"
П.С. В отличии от предыдущих моих поделок, здесь я уже начал использовать функции и исключения.



Comments (1)

    Был косяк с unicode, исправил...

Отправить комментарий