Сортировка по названию в Python
Сортировка по названию в Python легко реализуется при помощи функции natsorted() модуля natsort. Особенность работы функции natsorted() состоит в том, что она умеет корректно сортировать численно-буквенные названия. Рассмотрим работу этой функции в действии на практическом примере!
Входные данные
Дано: папка под названием «photos», в которой расположены файлы с фотографиями собак. Названия файлов включают в себя различные символы (цифры, буквы, скобки), а также могут быть разного разрешения(.jpg, .jgeg):

Что нужно сделать?
Нужно: прочитать названия файлов, сформировать из этих названий список, а затем упорядочить элементы списка в алфавитном порядке, то есть осуществить сортировку по названию в Python. Итоговый список с названиями должен иметь вид:
['1(0).jpg', '1.jpg', '2(0).jpg', '2(1).jpeg', '2(1).jpg', '2sleeping.jpg', '3 small_dog.jpg', '3.jpg', '10(0).jpg', 'Buldog.jpg', 'black_dog.jpg']
Решение задачи:
1. Импортируем необходимые модули:
- модуль os нам понадобится для считывания названий файлов из директории;
- из модуля natsort мы будем вызывать функцию natsorted() для сортировки списка с названиями файлов:
import os
import natsort
Если у вас не установлен модуль natsort, это легко исправить с помощью команды:
pip install natsort или pip3 install natsort, в зависимости от версии Python
2. Считываем названия файлов из директории photos в список filenames.
Для этого определим путь к директории с файлами, а после — прочитаем названия с помощью функции listdir() модуля os:
import os
import natsort
# определяем путь к директории с файлами
filepath = 'photos'
# считываем названия файлов в список filenames
filenames = os.listdir(filepath)
# Выведем на экран неотсортированный спиcок
print(filenames)
Результат работы кода:
неотсортиванный спиок: ['2(1).jpg', '2(0).jpg', '1(0).jpg', '3.jpg', '3 small_dog.jpg', 'Buldog.jpg', 'black_dog.jpg', '2sleeping.jpg', '1.jpg', '2(1).jpeg', '10(0).jpg']
Как видно из полученного результата, на данный момент список filenames состоит из неупорядоченных элементов.
3. Упорядочим список filenames.
Для этого достаточно вызвать функцию natsorted() модуля natsort. В качестве аргумента передадим функции natsorted() наш список filenames:
import os
import natsort
filepath = 'photos'
filenames = os.listdir(filepath)
print(filenames)
#осуществляем сортировку по названиям файлов
sorted_filenames = natsort.natsorted(filenames)
#Выведем на экран отсортированный список
print(sorted_filenames)
Результат работы кода:
отсортированный список: ['1(0).jpg', '1.jpg', '2(0).jpg', '2(1).jpeg', '2(1).jpg', '2sleeping.jpg', '3 small_dog.jpg', '3.jpg', '10(0).jpg', 'Buldog.jpg', 'black_dog.jpg']
Как видно из выведенного на экран результата, список успешно отсортирован. Соблюдена сортировка по числовым значениям и учтен алфавитный порядок букв!
Итоговый код можно посмотреть ниже:
# модуль os нам понадобится для считывания названий файлов из директории
import os
# модуль для сортировки списка
import natsort
# определяем путь к директории с файлами
filepath = 'photos'
# считываем названия файлов в список filenames
filenames = os.listdir(filepath)
print('неотсортиванный спиок: ',filenames)
# oсуществляем сортировку по названиям файлов
sorted_filenames = natsort.natsorted(filenames)
print('отсортированный список: ', sorted_filenames)
Результат работы итогового кода:
неотсортиванный спиок: ['2(1).jpg', '2(0).jpg', '1(0).jpg', '3.jpg', '3 small_dog.jpg', 'Buldog.jpg', 'black_dog.jpg', '2sleeping.jpg', '1.jpg', '2(1).jpeg', '10(0).jpg'] отсортированный список: ['1(0).jpg', '1.jpg', '2(0).jpg', '2(1).jpeg', '2(1).jpg', '2sleeping.jpg', '3 small_dog.jpg', '3.jpg', '10(0).jpg', 'Buldog.jpg', 'black_dog.jpg'
