Для конкретно вашего случая
Maximxls привёл приемлемое решение.
Я с похожей задачей сталкивался, когда делал
CLI утилиту формирования плейлистов для аудиокниг.
Там нужно было правильно отсортировать файлы с главами книги, при этом файлы пронумерованы, содержат текст, размещены в подкаталогах (тоже пронумерованных и с текстом).
Имя каждого файла парсилось (разделялось) на составные части, и формировался ключ для сортировки вот такой вот функцией:
def filename_key(fn: Path, root: Path = None) -> typing.Hashable:
def split(s: str, re_splitter=re.compile(r'(\D+|\d+)')) -> tuple:
return tuple(int(chunk) if chunk.isdigit() else chunk for chunk in re_splitter.split(s) if chunk)
rel_path = fn.relative_to(root) if root else fn
return tuple(split(name) for name in rel_path.parent.parts) + (split(rel_path.stem) + (rel_path.suffix,),)
Можно применять так:
my_files = (f for f in my_folder_path.rglob('*.mp3'))
my_sorted_files = sorted((
(filename_key(f, root=my_folder_path), f)
for f in my_files
))