Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 11.01.2020
Сообщений: 13

Порядок обработки файлов (сортировка)

21.01.2020, 18:56. Показов 2264. Ответов 16

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане!
Друзья, проблема такая. Имеется простенькая программа по составлению 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/c2... Cpjwm4.jpg
https://sun9-27.userapi.com/c8... 2IgEHs.jpg
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.01.2020, 18:56
Ответы с готовыми решениями:

Порядок обработки url паттернов в django
Имеется url такого вида url(r'^archive/$', archive, name='archive'), url(r'^(?P<category>+)/$', category, name='category'), ...

Загрузка JSON файлов. Порядок обработки
Всем привет. Помогите решить проблему. Я сделал класс с методом загрузки json файла и классами обработки информации из этого файла. Вот...

Порядок обработки событий в неблокирующем Socket
Коллеги, всем привет! Мучает вопрос: как обрабатываются события на сервере. Неблокирующий режим, 3500 клиентов. Как обработается событие,...

16
 Аватар для Semen-Semenich
5226 / 3472 / 1174
Регистрация: 21.03.2016
Сообщений: 8,300
21.01.2020, 19:19
то есть я так понимаю порядок определяется тут 09-01.2.6И2-0-2,09-01.2.8И3-2-1 и двух файлов с одинаковым числом в этой позиции не бывает?
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.01.2020, 19:21
Цитата Сообщение от azlimanty Посмотреть сообщение
как они сортируются Windows?
09-01.2.8И3-2-1.txt
09-1.2.6И2-0-2.txt

У меня так винда сортирует. По лексикографическому возрастанию.
И glob точно также берет:
Python
1
2
3
>>> glob.glob('*.txt')
['09-01.2.8И3-2-1.txt', '09-1.2.6И2-0-2.txt']
>>>
Вместо бесполезных скринштов - приведите список файлов в сортировке как в каталоге . И порядок выдачи через glob.
1
0 / 0 / 0
Регистрация: 11.01.2020
Сообщений: 13
21.01.2020, 19:31  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Вместо бесполезных скринштов - приведите список файлов в сортировке как в каталоге . И порядок выдачи через glob.
Прошу прощения. В каталоге порядок сортировки следующий:
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

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

Добавлено через 2 минуты
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
то есть я так понимаю порядок определяется тут 09-01.2.6И2-0-2,09-01.2.8И3-2-1 и двух файлов с одинаковым числом в этой позиции не бывает?
Почему, теоретически и практически может быть, если я Вас правильно понял. Например может быть:
09-01.2.6И2-0-1
09-01.2.6И2-0-2
Но полностью двух одинаковых номеров быть не может.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.01.2020, 19:48
В общем так: винда (по историческим причинам) сортирует неверно (не в посимвольном лексикографиеском порядке, а по своим правилам).
Это все что я могу сказать.
1
0 / 0 / 0
Регистрация: 11.01.2020
Сообщений: 13
21.01.2020, 19:50  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
В общем так: винда (по историческим причинам) сортирует неверно (не в посимвольном лексикографиеском порядке, а по своим правилам).
Это все что я могу сказать.
И вообще в Python невозможно реализовать алгоритм сортировки также, как и в винде?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.01.2020, 19:52
У меня нет алгоритма сортировки винды. Винда это система с закрытым исходным кодом :-).
Все что что нагуглил, это то что она игнорирует некоторые символы и объединяет цифры в одно число при сортировке.
1
 Аватар для Semen-Semenich
5226 / 3472 / 1174
Регистрация: 21.03.2016
Сообщений: 8,300
21.01.2020, 19:54
azlimanty, ну вот в этом и загвоздка. допустим по значениям перед И отсортировать не проблема
09-01.2.6И2-0-1.xls
09-01.2.6И2-0-2.xls
09-01.2.6И2-0-2.xls
09-01.2.8И3-2-1.xls
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
но как видно первые три отсортированы не правильно а вот по каким признакам это происходит не пойму
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def selection(name):
    param = name.split('.')[2]
    index = 0
    number =''
    while param[index].isdigit():
        number += param[index]
        index += 1 
    return int(number)
    
 
listdir_ = '''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
09-01.2.6И2-0-1.xls
09-01.2.6И2-0-2.xls''' .split('\n')
 
for name in sorted(sorted(listdir_), key = selection ):
    print(name)
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.01.2020, 20:22
Semen-Semenich,
Нужно игнорировать дефис, объединять цифры в число и сравнивать числа (целиком) как числа, а не как строки.
Можно еще заюзать виндовый компаратор StrCmpLogicalW. Винда так (примерно) делает.
1
0 / 0 / 0
Регистрация: 11.01.2020
Сообщений: 13
21.01.2020, 20:25  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
StrCmpLogicalW
а вот с этой штукой Вы верно подметили. Гугол забросил меня сюда, и что-то мне подсказывает, что здесь есть ответ:
https://stackoverflow.com/ques... -algorithm
0
 Аватар для Semen-Semenich
5226 / 3472 / 1174
Регистрация: 21.03.2016
Сообщений: 8,300
21.01.2020, 20:29
Garry Galler, я тоже так подумал
09-01.2.12И2-0-2 > 0901212202 int> 901212202
09-01.2.13И2-2 > 090121322 int > 90121322
>>> 901212202 < 90121322
False
а как строка
>>> 'И2-0-2' < 'И2-2'
True
вот в чем вопрос
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.01.2020, 20:57
Лучший ответ Сообщение было отмечено azlimanty как решение

Решение

Через компаратор StrCmpLogicalW:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import ctypes
from pprint import pprint
from functools import cmp_to_key
 
StrCmpLogical = ctypes.windll.shlwapi.StrCmpLogicalW
 
py='''
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'''
 
 
win='''
09-01.2.6И2-0-2.xls
09-01.2.8И3-2-1.xls
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'''
 
 
res = sorted(py.split(),key=cmp_to_key(StrCmpLogical))
print(res == win.split())
pprint(res)
Code
1
2
3
4
5
6
7
8
9
10
11
True
['09-01.2.6И2-0-2.xls',
 '09-01.2.8И3-2-1.xls',
 '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']
Добавлено через 3 минуты
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
'И2-0-2' < 'И2-2'
True
вот в чем вопрос
Там перед ней подстрока 09-01.2.12И - она больше. меньше.
А в 'И2-0-2' < 'И2-2 - числа 202 и 22 сравниваются как числа.
1
0 / 0 / 0
Регистрация: 11.01.2020
Сообщений: 13
21.01.2020, 21:00  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
import ctypes
я с этим уже убился, не устанавливается эта библиотека.
Ошибка:
ERROR: Could not find a version that satisfies the requirement ctypes (from versions: none)
ERROR: No matching distribution found for ctypes

Пробовал установить как через cmd, так и через Pycharm

Добавлено через 24 секунды
pip обновил до последней версии, если это важно
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.01.2020, 21:02
Это встроенная либа. Ее не надо ставить.
1
0 / 0 / 0
Регистрация: 11.01.2020
Сообщений: 13
21.01.2020, 21:03  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Это встроенная либа. Ее не надо ставить.
в таком случае удалять Python под чистую и ставить по новой?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.01.2020, 21:07
Цитата Сообщение от azlimanty Посмотреть сообщение
ставить по новой?
Зачем? У вас что ctypes не импортируется?
1
0 / 0 / 0
Регистрация: 11.01.2020
Сообщений: 13
21.01.2020, 21:13  [ТС]
['09-01.2.6И2-0-2.xls',
'09-01.2.8И3-2-1.xls',
'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'][/quote]
Благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.01.2020, 21:13
Помогаю со студенческими работами здесь

Порядок обработки сообщений от Web сервера
Начинаю только осваивать &quot;общение&quot; с Web. Возник такой нюанс. Получаю сообщение путём WebSocket ws; ws.OnMessage...

Как изменить порядок обработки шаблонов Word?
Добрый день, есть две макры, одна в Normal, другая в шаблоне, подгружаемом как AddIns. Обоим присвоена одна и та же комбинация клавиш....

Порядок обработки правил при валидации (jQuery Validation)
Приветствую. Имеется jQuery v1.7.1 и jQuery Validation Plugin 1.9.0. Потребовалось помимо обычной валидации добавить ещё и...

По алгоритму Джонсона выстроить оптимальный порядок обработки деталей
Program n3; var t, p: array of real; min: real; i, j, ki, kj, m, l, f: integer; Begin For i:=1 to 5 do begin for j:=1 to 3...

Порядок обработки аргументов при раскытии Variadic Template
template&lt;typename ... Args&gt; void func(Args ... args) { foo(bar(args) ...); } func должен провести над каждым операндом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru