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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2020, 19:00   #1
azlimanty
Новичок
Джуниор
 
Регистрация: 21.01.2020
Сообщений: 5
По умолчанию Порядок обработки файлов (сортировка)

Доброго времени суток, форумчане!
Друзья, проблема такая. Имеется простенькая программа по составлению excel-файла с содержанием путём обработки всех Эксель файлов в директории. Ввиду своеобразного сравнения строк, Питон обрабатывает файл с номером 09-01.2.8И3-2-1 в самом конце, хотя должен брать в начале. Как сделать так, чтобы интерпретатор брал их в том же порядке, как они сортируются Windows? Чтобы сначала он брал 09-1.2.6И2-0-2, затем 09-01.2.8И3-2-1, потом все остальные. Файлы перебираю через for file in glob.glob(‘0*.xls’). К сожалению, изменить наименование файлов не представляется возможным, они должны быть вот такими.
https://sun9-43.userapi.com/c205516/...XWw0Cpjwm4.jpg
https://sun9-27.userapi.com/c855432/...x5E_2IgEHs.jpg
azlimanty вне форума Ответить с цитированием
Старый 21.01.2020, 19:50   #2
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Ну вы бы хоть проект приложили, можно с пустыми файлами, главное что-бы они так и назывались.
Скрины как в win и какой результирующий список у python.
Arkuz вне форума Ответить с цитированием
Старый 21.01.2020, 19:55   #3
azlimanty
Новичок
Джуниор
 
Регистрация: 21.01.2020
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Arkuz Посмотреть сообщение
Ну вы бы хоть проект приложили, можно с пустыми файлами, главное что-бы они так и назывались.
Скрины как в win и какой результирующий список у python.
Прошу прощения. В каталоге порядок сортировки следующий:
1)09-01.2.6И2-0-2.xls
2)09-01.2.8И3-2-1.xls
3)09-01.2.12И2-0-1.xls
4)09-01.2.12И2-0-2.xls
5)09-01.2.13И2-2.xls
6)09-01.2.14И2-1.xls
7)09-01.2.14И2-2И1.xls
8)09-01.2.15И2-1.xls
9)09-01.2.15И2-2.xls
10)09-01.2.18И1-1.xls

А glob.glob сортирует:

1)09-01.2.12И2-0-1.xls
2)09-01.2.12И2-0-2.xls
3)09-01.2.13И2-2.xls
4)09-01.2.14И2-1.xls
5)09-01.2.14И2-2И1.xls
6)09-01.2.15И2-1.xls
7)09-01.2.15И2-2.xls
8)09-01.2.18И1-1.xls
9)09-01.2.6И2-0-2.xls
10)09-01.2.8И3-2-1.xls

мне соответственно нужна та же сортировка, как и в винде

Последний раз редактировалось azlimanty; 21.01.2020 в 20:05.
azlimanty вне форума Ответить с цитированием
Старый 21.01.2020, 20:01   #4
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Попробуйте сортировку результирующего списка, полученного от glob.glob
https://tproger.ru/translations/python-sorting/
Arkuz вне форума Ответить с цитированием
Старый 21.01.2020, 20:05   #5
azlimanty
Новичок
Джуниор
 
Регистрация: 21.01.2020
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Arkuz Посмотреть сообщение
Попробуйте сортировку результирующего списка, полученного от glob.glob
https://tproger.ru/translations/python-sorting/
Пробовал, возвращает None
azlimanty вне форума Ответить с цитированием
Старый 21.01.2020, 20:11   #6
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Цитата:
Сообщение от azlimanty Посмотреть сообщение
Пробовал, возвращает None
Видно что-то не дочитали.
1. Сделать обычную сортировку по возрастанию очень просто — достаточно вызвать функцию sorted(), которая вернёт новый отсортированный список:
new_list = sorted([5, 2, 3, 1, 4])

2. Также можно использовать метод списков list.sort(), который изменяет исходный список (и возвращает None во избежание путаницы).
a.sort() - вернет None, все изменения уже в списке a

Сортировка списка строк в порядке возрастания
Код:
Fruits = ["Apple", "Banana", "Tomato", "Grapes"]
Fruits.sort()
print(Fruits)

# ['Apple', 'Banana', 'Grapes', 'Tomato']
Сортировка списка строк по убыванию
Код:
Fruits = ["Apple", "Banana", "Tomato", "Grapes"]
Fruits.sort(reverse = True)
print(Fruits)

# ['Tomato', 'Grapes', 'Banana', 'Apple']

Последний раз редактировалось Arkuz; 21.01.2020 в 20:14.
Arkuz вне форума Ответить с цитированием
Старый 21.01.2020, 20:19   #7
azlimanty
Новичок
Джуниор
 
Регистрация: 21.01.2020
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Arkuz Посмотреть сообщение
Видно что-то не дочитали.
Да, действительно. Выполнил сортировку, результат, к сожалению, не изменился. И с точки зрения лексикографического порядка Python прав. Но, повторюсь, у Windows сортировка другая, и она как раз таки нужна. Продолжаю биться дальше,но все равно не понимаю, как это реализовать
azlimanty вне форума Ответить с цитированием
Старый 21.01.2020, 20:54   #8
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Приложите проект с файлами, если можно. Файлы можете очистить.

Посмотрите еще в эту сторону "Python: сортировка списков методом .sort() с ключом" - https://habr.com/ru/post/138535/

Последний раз редактировалось Arkuz; 21.01.2020 в 21:00.
Arkuz вне форума Ответить с цитированием
Старый 21.01.2020, 21:49   #9
sorokousov
Новичок
Джуниор
 
Регистрация: 21.01.2020
Сообщений: 6
По умолчанию

Есть с первого взгляда сложный способ, но если разобраться, то всё просто)
Код:
import re

a = [
    '09-01.2.12И2-0-1.xls',
    '09-01.2.12И2-0-2.xls',
    '09-01.2.13И2-2.xls',
    '09-01.2.14И2-1.xls',
    '09-01.2.14И2-2И1.xls',
    '09-01.2.15И2-1.xls',
    '09-01.2.15И2-2.xls',
    '09-01.2.18И1-1.xls',
    '09-01.2.6И2-0-2.xls',
    '09-01.2.8И3-2-1.xls']
for i in a:
    print(re.split('([0-9]+)', i))
key = lambda y: [dig(c) for c in re.split('([0-9]+)', y)]
"""key разбивает строки с помощью регулярного выражения ([0-9]+)
т.е строку as-r5io99.ok он разобьет в список ['as-r', '5', 'io', '99', '.ok']
после, в dig строка фильтруется от символов с помощью int(x)
Как итог массив списков с цифрами сортируется и эта карта накладывается на наш список"""
dig = lambda x: int(x) if x.isdigit() else 0
b = sorted(a, key=key)

print(b)
sorokousov вне форума Ответить с цитированием
Старый 22.01.2020, 21:55   #10
azlimanty
Новичок
Джуниор
 
Регистрация: 21.01.2020
Сообщений: 5
По умолчанию

Цитата:
Сообщение от sorokousov Посмотреть сообщение
Есть с первого взгляда сложный способ, но если разобраться, то всё просто)
Код:
import re

a = [
    '09-01.2.12И2-0-1.xls',
    '09-01.2.12И2-0-2.xls',
    '09-01.2.13И2-2.xls',
    '09-01.2.14И2-1.xls',
    '09-01.2.14И2-2И1.xls',
    '09-01.2.15И2-1.xls',
    '09-01.2.15И2-2.xls',
    '09-01.2.18И1-1.xls',
    '09-01.2.6И2-0-2.xls',
    '09-01.2.8И3-2-1.xls']
for i in a:
    print(re.split('([0-9]+)', i))
key = lambda y: [dig(c) for c in re.split('([0-9]+)', y)]
"""key разбивает строки с помощью регулярного выражения ([0-9]+)
т.е строку as-r5io99.ok он разобьет в список ['as-r', '5', 'io', '99', '.ok']
после, в dig строка фильтруется от символов с помощью int(x)
Как итог массив списков с цифрами сортируется и эта карта накладывается на наш список"""
dig = lambda x: int(x) if x.isdigit() else 0
b = sorted(a, key=key)

print(b)
Спасибо! Но уже нашёл немного другое решение:

Код:
import re
import ctypes
explorer_cmp = ctypes.windll.shlwapi.StrCmpLogicalW


def natural_key(astr):
    """Реализация метода сортировки, как в Windows"""
    return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', astr)]
И вызов функции как раз выполняет требуемую сортировку
azlimanty вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinAPI для обработки файлов (С, С++) ozon11 Помощь студентам 8 07.03.2015 00:19
Программирование операций обработки файлов Andrey93 Паскаль, Turbo Pascal, PascalABC.NET 1 16.05.2011 18:38
[c++][list] Порядок обработки двух list Padavan Помощь студентам 1 10.05.2011 14:56
Алгоритмы обработки файлов Troilk Помощь студентам 0 15.03.2011 02:21
Оптимизация обработки файлов dinon Microsoft Office Excel 3 30.04.2009 19:09