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

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

04.07.2019, 15:46. Показов 4836. Ответов 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
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
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
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru