[Небольшое приложение Python] 8 строк кода для дедупликации файлов

Python
[Небольшое приложение Python] 8 строк кода для дедупликации файлов

«Это 8-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г.".

Описание требования

На прошлой неделе мне неожиданно пришло задание экспортировать данные между ХХ и ХХ годами через сайт ХХ.Имя экспортируемого файла соответствует дате.После экспорта я обнаружил,что некоторые файлы имеют одинаковый размер и разные имена файлов.Просто открой файл.прочитав его я обнаружил что содержимое двух файлов с разными именами файлов дублируется.причина пока не ясна.предсказание причина сайта.в итоге было найдено что только около 30% данных не были дублированы. Мне жаль!

Ничего не говорите, первая задача - отфильтровать те файлы, которые не являются дубликатами, или удалить дубликаты файлов. Есть много сотен файлов.По оценкам, вам придется работать сверхурочно, чтобы удалить их, сравнивая их один за другим, а затем внезапно подумать об этом.Pythonимеет встроенныйfilecmpМожет показаться, что вы сравниваете файлы, тут особо нечего сказать, просто откройте целиком~

код

Все экспортированные файлы сохраняются в одной папке и в одном формате. Тогда взгляните на официальную документациюfilecmp.cmp()использование. Примерное резюме выглядит следующим образом:

filecmp.cmp(f1, f2, shallow=True)

  • f1/f2: два пути к файлам для сравнения.
  • shallow: по умолчаниюTrue, то есть сравнивать толькоos.stat()Совпадают ли полученные метаданные (время создания, размер и т. д.), установите значениеFalseЕсли это так, сравните содержимое файла при сравнении файлов.

Чтобы код не вызывал проблем, я сначала создалtestПапка, созданная вручную 6 файлов в папке, 1~5 имеют только цифровой контент, соответствующий 1, 2, 3, 4, 5, а шестой файл является пустым.Затем сделайте копию всего файла. следующее

тестовый код

from pathlib import Path
import filecmp

path_list = [path for path in Path(r'C:\Users\pc\Desktop\test').iterdir() if path.is_file()]

for front in range(len(path_list) - 1):
    for later in range(front + 1, len(path_list)):
        if filecmp.cmp(path_list[front], path_list[later], shallow=False):
            path_list[front].unlink()    # 删除文件
            break

текущий результат Общая логика кода очень проста, сначала получите «все файлы» под соответствующим файлом, где «все файлы» относятся кtestПуть к файлу первого уровня в каталоге, еслиtestЕсли в папке есть подпапки, то путь к файлу в подпапке не будет получен, а поскольку указанныйpath.is_file(),такpath_listполучить только путь к файлу (txt, xlsx, csv, zip и т.д.). Затем сравните, совпадает ли содержимое файла двух текущих путей через двухслойный цикл, и если они совпадают, удалите файл.

Хотя количество кода невелико, это действительно может сократить время ручной обработки, хорошо, заканчивайте цветок~


Это то, чем я хочу поделиться сегодня, поиск WeChatНовые горизонты Python, приносить вам больше полезных знаний каждый день.