Nonalphanumeric list order из os.listdir () в Python

Я часто использую python для обработки каталогов данных. Недавно я заметил, что порядок списков по умолчанию изменился на нечто почти бессмысленное. Например, если я в текущем каталоге, содержащем следующие подкаталоги: run01, run02, … run19, run20, а затем создаю список из следующей команды:

dir = os.listdir(os.getcwd()) 

то я обычно получаю список в следующем порядке:

 dir = ['run01', 'run18', 'run14', 'run13', 'run12', 'run11', 'run08', ... ] 

и так далее. Порядок был буквенно-цифровым. Но этот новый порядок остался со мной на некоторое время.

Что определяет (отображается) порядок этих списков? Здесь есть какое-то правило? Является ли это результатом некоторых настроек, которые я забыл?

EDIT: Спасибо за все предложения, кто-нибудь знает, где / как файловая система определяет этот порядок? Я решил, что это происходит только на установленном MacFUSE диске.

  • Создание отчетов с помощью Python: PDF или HTML в PDF
  • Скрыть консоль chromeDriver в python
  • Python threading - как получить родительский идентификатор / имя
  • принуждение к Unicode: нужна строка или буфер, NoneType найден при рендеринге в django admin
  • Преобразование длинных целых чисел в строки в пандах (чтобы избежать научной нотации)
  • Как использовать autodoc Sphinx для документирования метода __init __ (self) класса?
  • Обработка больших плотных матриц в python
  • Slice Pandas DataFrame by Row
  • 8 Solutions collect form web for “Nonalphanumeric list order из os.listdir () в Python”

    Я думаю, что порядок имеет отношение к тому, как файлы индексируются в вашей файловой системе. Если вы действительно хотите, чтобы он придерживался определенного порядка, вы всегда можете отсортировать список после получения файлов.

    Вы можете использовать встроенную sorted функцию для сортировки строк, как вы хотите. Основываясь на том, что вы описываете,

     sorted(os.listdir(whatever_directory)) 

    Кроме того, вы можете использовать метод .sort для списка:

     lst = os.listdir(whatever_directory) lst.sort() 

    Думаю, должен сделать трюк.

    Обратите внимание, что порядок, в котором os.listdir получает имена файлов, вероятно, полностью зависит от вашей файловой системы.

    По документации :

    os.listdir (путь)

    Верните список, содержащий имена записей в каталоге, заданном путем. Список находится в произвольном порядке . Он не включает специальные записи '.' и «..», даже если они присутствуют в каталоге.

    На заказ нельзя полагаться и является артефактом файловой системы.

    Чтобы отсортировать результат, используйте sorted(os.listdir(path)) .

    Вероятно, это просто заказ, который возвращает readdir() . Попробуйте запустить эту программу на C:

     #include <dirent.h> #include <stdio.h> int main(void) { DIR *dirp; struct dirent* de; dirp = opendir("."); while(de = readdir(dirp)) // Yes, one '='. printf("%s\n", de->d_name); closedir(dirp); return 0; } 

    Строка построения должна быть чем-то вроде gcc -o foo foo.c

    PS Просто запустил этот и ваш код на Python, и они оба дали мне отсортированный результат, поэтому я не могу воспроизвести то, что вы видите.

     In [6]: os.listdir? Type: builtin_function_or_method String Form:<built-in function listdir> Docstring: listdir(path) -> list_of_strings Return a list containing the names of the entries in the directory. path: path of directory to list The list is in **arbitrary order**. It does not include the special entries '.' and '..' even if they are present in the directory. 

    Предложенная комбинация команд os.listdir и отсортированных команд генерирует тот же результат, что и команда ls -l под Linux. Следующий пример проверяет это предположение:

     user@user-PC:/tmp/test$ touch 3a 4a 5a bc d1 d2 d3 kl p0 p1 p3 q 410a 409a 408a 407a user@user-PC:/tmp/test$ ls -l total 0 -rw-rw-r-- 1 user user 0 Feb 15 10:31 3a -rw-rw-r-- 1 user user 0 Feb 15 10:31 407a -rw-rw-r-- 1 user user 0 Feb 15 10:31 408a -rw-rw-r-- 1 user user 0 Feb 15 10:31 409a -rw-rw-r-- 1 user user 0 Feb 15 10:31 410a -rw-rw-r-- 1 user user 0 Feb 15 10:31 4a -rw-rw-r-- 1 user user 0 Feb 15 10:31 5a -rw-rw-r-- 1 user user 0 Feb 15 10:31 b -rw-rw-r-- 1 user user 0 Feb 15 10:31 c -rw-rw-r-- 1 user user 0 Feb 15 10:31 d1 -rw-rw-r-- 1 user user 0 Feb 15 10:31 d2 -rw-rw-r-- 1 user user 0 Feb 15 10:31 d3 -rw-rw-r-- 1 user user 0 Feb 15 10:31 k -rw-rw-r-- 1 user user 0 Feb 15 10:31 l -rw-rw-r-- 1 user user 0 Feb 15 10:31 p0 -rw-rw-r-- 1 user user 0 Feb 15 10:31 p1 -rw-rw-r-- 1 user user 0 Feb 15 10:31 p3 -rw-rw-r-- 1 user user 0 Feb 15 10:31 q user@user-PC:/tmp/test$ python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> os.listdir( './' ) ['d3', 'k', 'p1', 'b', '410a', '5a', 'l', 'p0', '407a', '409a', '408a', 'd2', '4a', 'p3', '3a', 'q', 'c', 'd1'] >>> sorted( os.listdir( './' ) ) ['3a', '407a', '408a', '409a', '410a', '4a', '5a', 'b', 'c', 'd1', 'd2', 'd3', 'k', 'l', 'p0', 'p1', 'p3', 'q'] >>> exit() user@user-PC:/tmp/test$ 

    Итак, для тех, кто хочет воспроизвести результат известной команды ls -l в своем коде Python, сортировка (os.listdir (DIR)) работает очень хорошо.

    Я обнаружил, что «сортировка» не всегда делает то, что я ожидал. например, у меня есть каталог, как показано ниже, и «сортировка» дает мне очень странный результат:

     >>> os.listdir(pathon) ['2', '3', '4', '5', '403', '404', '407', '408', '410', '411', '412', '413', '414', '415', '416', '472'] >>> sorted([ f for f in os.listdir(pathon)]) ['2', '3', '4', '403', '404', '407', '408', '410', '411', '412', '413', '414', '415', '416', '472', '5'] 

    Кажется, он сначала сравнивает первый символ, если это самый большой, он будет последним.

    aaa = ['row_163.pkl', 'row_394.pkl', 'row_679.pkl', 'row_202.pkl', 'row_1449.pkl', 'row_247.pkl', 'row_1353.pkl', 'row_749.pkl' , 'row_1293.pkl', 'row_1304.pkl', 'row_78.pkl', 'row_532.pkl', 'row_9.pkl', 'row_1435.pkl']
    sorted (aaa, key = lambda x: int (os.path.splitext (x.split ('_') [1]) [0])) Как и в случае с моим требованием, у меня есть случай, например row_163.pkl здесь os .path.splitext ('row_163.pkl') разделит его на ('row_163', '.pkl'), поэтому нужно разбить его на основе «_».

    но в случае вашего требования вы можете сделать что-то вроде

    sort (aa, key = lambda x: (int (re.sub ('\ D', '', x)), x))

    где aa = ['run01', 'run08', 'run11', 'run12', 'run13', 'run14', 'run18'], а также для поиска каталогов вы можете сортировать (os.listdir (путь)),

    и для случая вроде «run01.txt» или «run01.csv» вы можете сделать это следующим образом:

    sorted (файлы, key = lambda x: int (os.path.splitext (x) [0]))

    Python - лучший язык программирования в мире.