Python: определение количества файлов определенных типов в директории

Реализуя идею объединения двух или более WAV-файлов в один в прошлом обзоре я неизменно натыкался на Vinyl-Rip-ы в которых было порой множество файлов. И чтобы их потом объединить в один и cнабдить CUE, нужно привести все эти файлы в один формат, а в частности пережать из любого lossless формата в WAV.

Но для этого нужно определить наличие в открытой пользователем директории файлов именно определенного типа – flac,  ape, wv.

Сегодня мы проанализируем директорию с файлами, и составим их список для дальнейшей конвертации в WAV.

Для работы с файлами и директориями понадобиться подключить библиотеку os, с помощью которой мы вызовем список файлов в директории, проверим их на соответствие типа по расширению и тд.

import os

На данном этапе прототипа кода укажем нужную директорию вручную в самом коде.

mus_dir  = ‘d:/music/’

Обратите внимание на слэши /, нужно писать именно так, хотя в Windows все привыкли к обратным слэшам выглядящим так \.

Это обусловлено тем, что в  языке Python обратный слэш \ зарезервирован за продолжением кода на следующей строке, пример:

a=’это все по прежнему \

    одна и та же строка \

    хотя  располагается на разных строках редактора’

Если же вы получаете пути к файлу из других функций и там вполне может попасться обратный слэш в пути к файлу, что сломает программу, то стоит предусмотреть автоматическую замену обратного слэша  на простой слэш, например так:

file_path = file_path.replace(‘\\’,’/’)

Здесь используется два обратных слэша, так как первый слэш это экранирование, поэтому второй слэш будет воспринят как именно обратный слэш , а не иное действие, а после запятой указано на что заменить обратный слэш, а именно на ‘/’.

Если кажется непонятным, то более наглядно:

чтобы какой-то символ, например кавычка ” мог быть показан на экране, перед ним надо поставить экран \

Распространенные символы с экранированием в Python:

  • \\ – Добавляет одиночный обратный слэш (например, "Это обратный слэш: \\") – выведет "Это обратный слэш: \"
  • \" – Добавляет двойную кавычку внутри строки с двойными кавычками (например, "Она сказала: \"Привет!\"")
  • \' – Добавляет одинарную кавычку внутри строки с одинарными кавычками (например, 'Солнечно.')
  • \n – Вставляет новую строку (например, "Первая строка\nВторая строка")
  • \t – Вставляет табуляцию (например, "Текст с отступом\tтекст")
  • \b – Удаляет предыдущий символ

Зададим интересующие нас расширения файлов, а именно flac, ape, wv в виде списка.

exten = [‘flac’,’ape’, ‘wv’]

Создадим пустой список fm в который будем помещать названия файлов, которые соотвествуют расширениям flac, ape, wv.

fm=[]

Теперь с помощью функции listdir просмотрим файлы директории поочередно, каждый помещаяв переменную filename
Для этого используем цикл for и оператор in
for filename in os.listdir(mdir):
здесь мы открываем на просмотр директорию,что указана в переменной mdir
И каждый файл помещаем попеременно в filename.
Название файла проверяем на расширение из нашего списка:
if any(filename.endswith(ext) for ext in exten):
Стоит отметить, что здесь пришлось использовать функцию any, которая возвращает истину или ложь при сравнении.
Из списка расширений extent мы последовательно берем каждое расширение и помещаем в переменную ext, а уже ееиспользуем в качестве аргумента в конструкции
filename.endswith(ext),
где и сравниваем расширение файла соответствует ли хоть какому-то из списка и any уже выдает “да” или “нет”.
После этого, если “да”, то помещаем название файла в список:
fm.append(filename)
По завершении создания списка можно определить и его размер, точнее длину, которая покажет число элементов списка, просто спросив через функцию
len:
print(‘Длина списка’, len(fm))
 
Итого, конечный прототип кода, который составляет список файлов, которые позже должны быть конвертированы в wav такой:
 
import os mus_dir  = ‘d:/music/’
#Как универсальное решение:
#mus_dir  = mus_dir.replace(‘\\’, “/”)
exten = [‘flac’,’ape’, ‘wv’]
fm=[]
 
for filename in os.listdir(mus_dir):
    if any(filename.endswith(ext) for ext in exten):
         fm.append(filename)
 
print(‘Длина списка’, len(fm))
#Просмотреть сам список
for spisok_file in fm:
    print (‘Список’, spisok_file)

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

Отправить ответ