Python: Search for analogs(md5)

Posted by Reason89 | 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, исправил...

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