Найти и удалить дубликаты файлов с помощью Python - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть несколько папок, которые содержат дубликаты файлов с немного разными именами (например, file_abc.jpg, file_abc (1) .jpg) или суффикс с "(1) в конце. Я пытаюсь разработать относительно простойметод для поиска в папке, выявления дубликатов, а затем их удаления. Критерием дубликата является «(1)» в конце файла, при условии, что оригинал также существует.

Я могу идентифицировать дубликатХорошо, однако у меня проблемы с созданием текстовой строки в правильном формате, чтобы удалить их. Это должно быть "C:\Data\temp\file_abc(1).jpg", однако, используя приведенный ниже код, я получаю r"C:\Data\temp''file_abc(1).jpg".

Я посмотрел наответы [ Поиск дубликатов файлов и их удаление , однако это кажется гораздо более изощренным, чем то, что мне нужно.

Если есть лучшие (+ простые) способы сделать это, тогда я позволюоднако, у меня всего около 10000 файлов в 50 нечетных папках, так что не так уж много данных, чтобы их перебрать.

Мой код на данный момент:

import os

file_path = r"C:\Data\temp"
file_list = os.listdir(file_path)
print (file_list)

for file in file_list:
    if ("(1)" in file):
    index_no = file_list.index(file)
    print("!! Duplicate file, number in list: "+str(file_list.index(file)))
    file_remove = ('r"%s' %file_path+"'\'"+file+'"')
    print ("The text string is: " + file_remove)
    os.remove(file_remove)

1 Ответ

0 голосов
/ 08 февраля 2019

Ваш код немного сложнее, чем необходимо, и вы не применили правильный способ создания пути к файлу из пути и имени файла.И я думаю, что вы не должны удалять файлы, которые не имеют оригинала (т.е. которые не являются дубликатами, хотя их имя выглядит так).

Попробуйте это:

for file_name in file_list:
    if "(1)" not in file_name:
        continue
    original_file_name = file_name.replace('(1)', '')
    if not os.path.exists(os.path.join(file_path, original_file_name):
        continue  # do not remove files which have no original
    os.remove(os.path.join(file_path, file_name))

Имейте в виду, что этоне работает должным образом для файлов с несколькими вхождениями (1), а файлы с (2) или более высокими номерами также вообще не обрабатываются.Таким образом, мое реальное предложение будет следующим:

  • Составьте список всех файлов во всем дереве каталогов ниже заданного начала (используйте os.walk(), чтобы получить это), затем
  • sortвсе файлы по размеру, затем
  • проходят по этому списку линейно, идентифицируют двойные числа (которые являются соседями в этом списке), а
  • дают каждую такую ​​двойную группу (то есть небольшой список файлов (как правило, только два), которые идентичны).

Конечно, вы должны проверить содержимое этих нескольких файлов, чтобы убедиться, что не только два из них случайно имеют одинаковый размер, не будучи идентичными.Если вы уверены, что у вас есть группа идентичных, удалите все, кроме одного с простейшими именами (например, без суффиксов (1) и т. Д.).


Кстати, я бы назвал file_path что-то вроде dir_path или root_dir_path (потому что это каталог и полный путь к нему).

...