Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2023, 10:52   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию Сортировка имени файла и полного пути к файлу

здравствуйте, код:
Код:
filelst = ['2.text', '10.text', '1.text']
def keyFunc(x): # => сортирует по принципу: ['1.text', '2.text', '10.text']
    return int(x.split('.')[0])
filelst.sort(key=keyFunc)
print('\n'.join(filelst))
работает, сортирует как нужно
а стоит добавить к имени файла его полный путь:
Код:
filelst = ['i:/Российская Федерация/2.text', 'i:/Российская Федерация/10.text', 'i:/Российская Федерация/1.text']
def keyFunc(x): # => сортирует по принципу: ['1.text', '2.text', '10.text']
    return int(x.split('.')[0])
filelst.sort(key=keyFunc)
print('\n'.join(filelst))
и получаю ошибку:
Traceback (most recent call last):
File "C:\pythonProject\sudrf.ru1.py" , line 11, in <module>
filelst.sort(key=keyFunc)
File "C:\pythonProject\sudrf.ru1.py" , line 10, in keyFunc
return int(x.split('.')[0])
^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'i:/Российская Федерация/2'
как сделать универсальный код, чтобы ему было без разницы, есть в элементе массива путь к файлу или нет
спасибо
Ципихович Эндрю на форуме Ответить с цитированием
Старый 31.12.2023, 11:01   #2
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

сам пробовал сделать:
Код:
filelst1 = ['2.text', '10.text', '1.text']
filelst2 = ['i:/Российская Федерация/2.text', 'i:/Российская Федерация/10.text', 'i:/Российская Федерация/1.text']
def keyFunc(x):
    if len(x) == 3:
        return int(x.split('.')[0])
    else:
        return str(x)
filelst1.sort(key=keyFunc)
print('\n'.join(filelst1))
print('=================')
filelst2.sort(key=keyFunc)
print('\n'.join(filelst2))
не получилось, ответ
1.text
10.text
2.text
=================
i:/Российская Федерация/1.text
i:/Российская Федерация/10.text
i:/Российская Федерация/2.text
Ципихович Эндрю на форуме Ответить с цитированием
Старый 31.12.2023, 11:26   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

решение есть:
Код:
filelst1 = ['2.text', '10.text', '1.text']
filelst2 = ['i:/Российская Федерация/2.text', 'i:/Российская Федерация/10.text', 'i:/Российская Федерация/1.text']
import re
def keyFunc(x):
    match = re.search(r'\d+', x) # Ищем число в имени файла
    if match:
        return int(match.group()) # Возвращаем число, найденное в имени файла
    else:
        return 0 # Если числа нет, возвращаем 0
filelst1.sort(key=keyFunc)
print('\n'.join(filelst1))
print('=================')
filelst2.sort(key=keyFunc)
print('\n'.join(filelst2))
решение верное, но не нравится, что в решении идёт привязка к цифрам, наверное могут найтись случаи, когда этот подход не сработает
Ципихович Эндрю на форуме Ответить с цитированием
Старый 31.12.2023, 12:30   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

2 решение
Код:
def keyFunc1(x):
    return int(x.split('/')[-1].split('.')[0])
filelst1.sort(key=keyFunc1)
print('\n'.join(filelst1))
print('=================')
filelst2.sort(key=keyFunc1)
print('\n'.join(filelst2))
Ципихович Эндрю на форуме Ответить с цитированием
Старый 31.12.2023, 14:25   #5
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

3 вариант
Код:
from natsort import natsorted # pip install natsort

filelst1 = ['2.text', '10.text', '1.text']
filelst2 = ['i:/Российская Федерация/2.text', 'i:/Российская Федерация/10.text', 'i:/Российская Федерация/1.text']

print('\n'.join(natsorted(filelst1)))
print('=================')
print('\n'.join(natsorted(filelst2)))
Ципихович Эндрю на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение полного пути к файлу процесу по ID pj-infest Win Api 15 02.12.2014 19:05
Как вытащить имя файла из полного пути к нему dimonfan2006 Microsoft Office Excel 2 07.12.2013 01:09
Скачивание файла из интернета, не зная пути и имени файла. Скрипт Microsoft Office Excel 0 14.09.2013 22:14
Достать директории из полного пути к файлу Kuzya59 Общие вопросы Delphi 7 23.09.2009 13:08
Как из полного пути к файлу получить имя файла с расширением uraura Компоненты Delphi 2 20.03.2009 15:53