Я часто использую Python для обработки каталогов данных. Недавно я заметил, что порядок списков по умолчанию изменился на что-то почти бессмысленное. Например, если я нахожусь в текущем каталоге, содержащем следующие подкаталоги: run01, run02, ... run19, run20, а затем я создаю список с помощью следующей команды:
dir = os.listdir(os.getcwd())
то я обычно получаю список в таком порядке:
dir = ['run01', 'run18', 'run14', 'run13', 'run12', 'run11', 'run08', ... ]
и так далее. Раньше порядок был буквенно-цифровым. Но этот новый порядок остался со мной на некоторое время.
Что определяет (отображаемый) порядок этих списков?
python
list
directory-listing
listdir
marshall.ward
источник
источник
listdir
вывод. Я не уверен, почему вопросы были объединены.Ответы:
Я думаю, что порядок связан с тем, как файлы индексируются в вашей файловой системе. Если вы действительно хотите, чтобы он придерживался определенного порядка, вы всегда можете отсортировать список после получения файлов.
источник
Вы можете использовать встроенную
sorted
функцию для сортировки строк, как хотите. Исходя из того, что вы описываете,В качестве альтернативы вы можете использовать
.sort
метод списка:Я думаю, это должно помочь.
Обратите внимание, что порядок
os.listdir
получения имен файлов, вероятно, полностью зависит от вашей файловой системы.источник
sorted(listdir)
Работал только у меня.listdir.sort()
дал мне: TypeError: объект 'NoneType' не повторяетсяreverse=True
чтобы сделать сортировку по убыванию.sorted
что написано первым, делает это одной строкой ОК?Согласно документации :
На порядок нельзя полагаться, это артефакт файловой системы.
Чтобы отсортировать результат, используйте
sorted(os.listdir(path))
.источник
Python по какой-либо причине не имеет встроенного способа естественной сортировки (что означает 1, 2, 10 вместо 1, 10, 2), поэтому вам придется написать его самостоятельно:
Теперь вы можете использовать эту функцию для сортировки списка:
ПРОБЛЕМЫ: если вы используете указанную выше функцию для сортировки строк (например, имен папок) и хотите, чтобы они были отсортированы, как это делает Проводник Windows, в некоторых крайних случаях она не будет работать должным образом.
Эта функция сортировки будет возвращать неверные результаты в Windows, если у вас есть имена папок с определенными «специальными» символами. Например, эта функция будет выполнять сортировку
1, !1, !a, a
, тогда как проводник Windows будет выполнять сортировку!1, 1, !a, a
.Поэтому, если вы хотите выполнить сортировку точно так же, как Windows Explorer в Python, вам нужно использовать встроенную функцию Windows StrCmpLogicalW через ctypes (это, конечно, не будет работать в Unix):
Эта функция немного медленнее, чем
sorted_alphanumeric()
.Бонус:
winsort
также можно сортировать полные пути в Windows .В качестве альтернативы, особенно если вы используете Unix, вы можете использовать
natsort
библиотеку (pip install natsort
) для правильной сортировки по полным путям (то есть подпапки в правильной позиции).Вы можете использовать его для сортировки полных путей:
Не используйте его для обычной сортировки только имен папок (или строк в целом), так как это немного медленнее, чем
sorted_alphanumeric()
указанная выше функция.natsorted
библиотека даст вам неверные результаты, если вы ожидаете сортировки Windows Explorer, поэтому используйтеwinsort()
для этого.источник
print( sorted_aphanumeric(["1", "10", "2", "foo_10", "foo_8"]) )
->['1', '2', '10', 'foo_8', 'foo_10']
. Как и ожидалось.natsorted
связанная с реализацией функции сопоставления Windows Explorer. Возможно, вам стоит предложить решение? github.com/SethMMorton/natsort/issues/41Я думаю, что по умолчанию порядок определяется значением ASCII. Решение этой проблемы - это
источник
Вероятно, это просто порядок
readdir()
возврата C. Попробуйте запустить эту программу на C:Линия сборки должна быть примерно такой
gcc -o foo foo.c
.PS Просто запустил это и свой код Python, и оба они дали мне отсортированный вывод, поэтому я не могу воспроизвести то, что вы видите.
источник
Поскольку в случае моего требования у меня есть случай, как
row_163.pkl
здесь,os.path.splitext('row_163.pkl')
он разбивается на('row_163', '.pkl')
поэтому необходимо также разделить его на основе '_'.но в случае вашего требования вы можете сделать что-то вроде
где
а также для получения каталога вы можете сделать
sorted(os.listdir(path))
и в случае подобного
'run01.txt'
или'run01.csv'
вы можете сделать это такисточник
Я обнаружил, что «сортировка» не всегда делает то, что я ожидал. например, у меня есть каталог, как показано ниже, и «сортировка» дает мне очень странный результат:
Кажется, сначала он сравнивает первый символ, если он самый большой, то он будет последним.
источник
('5' > '403') is True
.Из документации :
Это означает, что порядок, вероятно, зависит от ОС / файловой системы, не имеет особо значимого порядка и, следовательно, не может быть каким-либо конкретным. Как упоминалось во многих ответах: при желании полученный список можно отсортировать.
Ура :)
источник
Ответ Эллиота отлично решает эту проблему, но поскольку это комментарий, он остается незамеченным, поэтому с целью помочь кому-то я повторяю его как решение.
Используйте библиотеку natsort:
Установите библиотеку с помощью следующей команды для Ubuntu и других версий Debian
Python 2
Python 3
Подробная информация о том, как использовать эту библиотеку, находится здесь.
источник
sorted()
! СпасибоПредлагаемая комбинация команд
os.listdir
иsorted
дает тот же результат, что иls -l
команда в Linux. Следующий пример подтверждает это предположение:Итак, для тех, кто хочет воспроизвести результат хорошо известной
ls -l
команды в своем коде Python,sorted( os.listdir( DIR ) )
работает довольно хорошо.источник
источник