Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 12

Оставить в папке с файлами только самые большие по размеру, остальные - удалить

04.07.2019, 15:46. Показов 4869. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть проблема с сортировкой файлов в папке, а именно: имеется папка с файлами *.mp3 (~35 000 файлов). Некоторые из файлов повторяются вплоть до 250 раз (это на данный момент, дальше может быть больше). То есть, например, есть файлы Name_surname.mp3, Name_surname (1).mp3, Name_surname (2).mp3 ... Name_surname (249).mp3, Name_surname_name.mp3, Name_surname_name (1).mp3, Name_surname_name (2).mp3 ... Name_surname_name (249).mp3 Содержимое файлов в наборе аналогичное за исключением того, что некоторые больше размером и, соответственно, содержат больше информации. Необходимо из каждого такого набора файлов оставить только один самый большой по размеру.

Есть понимание, как это должно работать:
1. Получить список всех файлов в папке (directory_files = os.listdir(directory_path)).
2. Циклично брать имя первого файла в списке без расширения и цифрового индекса (directory_files[1][:-9]), например "Name_surname".
3. Из списка directory_files изъять все файлы содержащие имя directory_files[1][:-9] (в списке должны остаться Name_surname (1).mp3 ... Name_surname (249).mp3).
4. Отсортировать все оставшиеся файлы по размеру (по убыванию) в новый список del_list.
5. Из получившегося списка del_list удалить первый элемент (самый большой файл), циклом с os.remove() пройтись по всем оставшимся файлам в списке и удалить все элементы списка del_list из списка directory_files.
6. Повторить п.п.2-5 до тех пор, пока список directory_files не опустеет.

Как достать список всех файлов в директории и получить их размеры я разобрался. Но дальше пока не могу продвинуться, не понимаю, как осуществить поиск в списке файлов (как найти все вхождения Name_surname и внести их в отдельный список).
Заранее спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2019, 15:46
Ответы с готовыми решениями:

Оставить только выбранные checkbox-ы (остальные удалить или сделать невидимыми)
Если я создаю "список" checkbox-ов с помощью Scene Builder Можно ли оставить только выбранные checkbox остальные удалить или сделать...

Необходимо оставить в папке самые старые файлы и два самых новых
Помогите с решением Имеем папку с файлами архива. В ней допустим есть 3 самых старых созданных файлов например за 10.02.14. И каждый...

Сортировка одномерного массива - числа большие 2 по возрастанию, а остальные оставить на своих местах
вот примерный код, что там нужно исправить #include <stdio.h> #include <iostream.h> #include <conio.h> #include...

4
 Аватар для Semen-Semenich
5237 / 3481 / 1176
Регистрация: 21.03.2016
Сообщений: 8,310
04.07.2019, 20:21
Лучший ответ Сообщение было отмечено wmzkot как решение

Решение

wmzkot, вот такой вариант
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import os
 
def take(name):
    size = os.path.getsize(f'{path}/{name}')# размер файла
    alias = name[:name.find('(')]# имя файла без добавок номера (псевдоним файла)
    return alias,size
 
def deletion(name):
    os.remove(f'{path}/{name}')
 
name_size = {} # словарь хранения имени и размера (псевдоним файла : [полное имя, размер])
path = 'music' # полный путь к папке с файлами
directory_files = os.listdir(path) # directory_path
 
for name in directory_files: # перебираем имена файлов
    alias,size = take(name) # получаем псевдоним и размер
    
    if alias not in name_size: # если псевдонима нет в словаре
        name_size[alias] = [name,size] # под псевдонимом добавляем в ключ полное имя и размер
    else:                                               # если есть
        fullname,size_1 = name_size[alias] #получаем полное имя и размер из словаря по псевдониму
        
        if size < size_1:      # сравниваем размеры текущего и сохраненного файла
            deletion(name) # если сохраненный больше то удаляем текущий в папке по полному имени
        else:
            deletion(fullname) # иначе удаляем сохраненный в словаре с меньшим размером
            name_size[alias] = [name,size] # записываем в словарь имя текущего с большим размером
2
 Аватар для t1m0n
638 / 416 / 27
Регистрация: 03.11.2009
Сообщений: 1,855
09.07.2019, 19:33
может лучше хеш файла сравнивать (md5, sha1), надежней определить можно дубликат или нет)
0
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 12
10.07.2019, 23:20  [ТС]
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
wmzkot, вот такой вариант
Да, отлично работает с первого раза без каких-либо правок.
Я пытался это реализовать более "костыльным путём", но так и не смог прийти к решению. Да и код у вас намного более оптимизированный. Мой неполный код только на 39 строк, а у вас всё в 27 уместилось.
Еще раз большое спасибо!

Добавлено через 2 минуты
Цитата Сообщение от t1m0n Посмотреть сообщение
может лучше хеш файла сравнивать (md5, sha1), надежней определить можно дубликат или нет)
Нет, не выйдет. Содержимое файлов значительно отличается. Это не дубликаты, а записи одних и тех же фрагментов, но только каждый фрагмент либо длиннее, либо короче по длительности, но при этом они имеют общую часть, конечно, но длительность и, соответственно, размер файлов отличаются порой в разы.
0
 Аватар для t1m0n
638 / 416 / 27
Регистрация: 03.11.2009
Сообщений: 1,855
17.07.2019, 00:01
wmzkot, может тогда использовать что-то типа такого поиск похожих аудио
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.07.2019, 00:01
Помогаю со студенческими работами здесь

Дан вещественный вектор. Все его элементы, большие 0, умножить на 10, остальные оставить без изменения
Дан вещественный вектор. Все его элементы, больше 0 - умножить на 10, остальные оставить без изменения и упорядочить полученный вектор по...

Как сделать, чтобы Tesseract распознавал только самые большие слова на картинке
Здравствуйте! Работаю с Tesseract впервые. Есть ли возможность сделать так, чтобы на картинке распознавались слова самого большого размера,...

Оставить в текстовом файле 20 строк, остальные удалить
есть файл .txt с бесконечным числом строк. как оставить в нем первые 20, а остальные удалить?

Вводить несколько чисел (от 0 до 20), а затем отображать самые маленькие и самые большие
Здравствуйте! Есть задача: &quot;Создать новый проект. Программа должна позволять вам вводить несколько чисел (от 0 до 20), а затем...

Разукрасить разними цветами самые большие и самые наименьшие элементы массива
Разукрасить разними цветами самые большие и самые наименьшие элементы массива.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru