Я написал следующий код Python:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, glob
path = '/home/my/path'
for infile in glob.glob( os.path.join(path, '*.png') ):
print infile
Теперь я получаю это:
/home/my/path/output0352.png
/home/my/path/output0005.png
/home/my/path/output0137.png
/home/my/path/output0202.png
/home/my/path/output0023.png
/home/my/path/output0048.png
/home/my/path/output0069.png
/home/my/path/output0246.png
/home/my/path/output0071.png
/home/my/path/output0402.png
/home/my/path/output0230.png
/home/my/path/output0182.png
/home/my/path/output0121.png
/home/my/path/output0104.png
/home/my/path/output0219.png
/home/my/path/output0226.png
/home/my/path/output0215.png
/home/my/path/output0266.png
/home/my/path/output0347.png
/home/my/path/output0295.png
/home/my/path/output0131.png
/home/my/path/output0208.png
/home/my/path/output0194.png
Каким образом это заказано?
Это может помочь вам получить мой вывод ls -l:
-rw-r--r-- 1 moose moose 627669 2011-07-17 17:26 output0005.png
-rw-r--r-- 1 moose moose 596417 2011-07-17 17:26 output0023.png
-rw-r--r-- 1 moose moose 543639 2011-07-17 17:26 output0048.png
-rw-r--r-- 1 moose moose 535384 2011-07-17 17:27 output0069.png
-rw-r--r-- 1 moose moose 543216 2011-07-17 17:27 output0071.png
-rw-r--r-- 1 moose moose 561776 2011-07-17 17:27 output0104.png
-rw-r--r-- 1 moose moose 501865 2011-07-17 17:27 output0121.png
-rw-r--r-- 1 moose moose 547144 2011-07-17 17:27 output0131.png
-rw-r--r-- 1 moose moose 530596 2011-07-17 17:27 output0137.png
-rw-r--r-- 1 moose moose 532567 2011-07-17 17:27 output0182.png
-rw-r--r-- 1 moose moose 553562 2011-07-17 17:27 output0194.png
-rw-r--r-- 1 moose moose 574065 2011-07-17 17:27 output0202.png
-rw-r--r-- 1 moose moose 552197 2011-07-17 17:27 output0208.png
-rw-r--r-- 1 moose moose 559809 2011-07-17 17:27 output0215.png
-rw-r--r-- 1 moose moose 549046 2011-07-17 17:27 output0219.png
-rw-r--r-- 1 moose moose 566661 2011-07-17 17:27 output0226.png
-rw-r--r-- 1 moose moose 561678 2011-07-17 17:27 output0246.png
-rw-r--r-- 1 moose moose 525550 2011-07-17 17:27 output0266.png
-rw-r--r-- 1 moose moose 565715 2011-07-17 17:27 output0295.png
-rw-r--r-- 1 moose moose 568381 2011-07-17 17:28 output0347.png
-rw-r--r-- 1 moose moose 532768 2011-07-17 17:28 output0352.png
-rw-r--r-- 1 moose moose 535818 2011-07-17 17:28 output0402.png
Это не упорядочено по имени файла или размеру.
ls
сама команда сортирует файлы по имени. 'ls -U' дает неупорядоченный список файлов в "порядке каталогов".os.listdir
: * nix OS возвращает файлы в не алфавитном порядке, и (позор, что я удивлен!), Это явно указано в документации : «Список в произвольном порядке».Ответы:
Вероятно, он вообще не сортируется и использует порядок, в котором записи появляются в файловой системе, то есть тот, который вы получаете при использовании
ls -U
. (По крайней мере, на моей машине это производит тот же порядок, что и списокglob
совпадений)источник
Заказ произвольный, но вы можете отсортировать их самостоятельно
Если вы хотите отсортировать по имени:
отсортировано по времени модификации:
отсортировано по размеру:
и т.п.
источник
files = glob.glob('teksty/*')
. Будет ли заказ предоставлен нам?Проверив исходный код,
glob.glob
вы увидите, что он внутренне вызываетos.listdir
, как описано здесь:http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir
Ключевое предложение: os.listdir (путь) Возвращает список, содержащий имена записей в каталоге, заданных путем. Список в произвольном порядке. Он не включает специальные записи "." и «..», даже если они присутствуют в каталоге.
Произвольный порядок . :)
источник
glob.glob () - это оболочка для os.listdir (), так что лежащая в основе ОС отвечает за доставку данных. В общем: вы не можете сделать предположение о заказе здесь. Основное предположение: нет порядка. Если вам нужна сортировка: сортируйте на уровне приложения.
источник
Порядок произвольный, но есть несколько способов их отсортировать. Один из них выглядит следующим образом:
источник
natsort
:from natsort import natsorted; files = natsorted(files)
.У меня была похожая проблема:
glob
возвращался список имен файлов в произвольном порядке, но я хотел просмотреть их в числовом порядке, как указано в имени файла. Вот как я этого добился:Мои файлы были возвращены
glob
чем-то вроде:Я отсортировал список на месте, для этого я создал функцию:
Эта функция возвращает числовую часть имени файла и преобразуется в целое число. Затем я вызвал метод сортировки в списке следующим образом:
Это вернул список как таковой:
источник
os.path.splitext(os.path.basename(s))[0]
вместоos.path.basename(s)[:-4]
, так что определение функции будет.def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])
Если вам интересно, что glob.glob делал в вашей системе в прошлом и не может добавить
sorted
вызов, порядок будет одинаковым для файловых систем Mac HFS + и будет обратным порядком в других системах Unix. Так что, скорее всего, он будет детерминированным, если базовая файловая система не будет реорганизована, что может произойти, если файлы были добавлены, удалены, переименованы, удалены, перемещены и т. Д.источник
Из решения @Johan La Rooy, сортировка изображений, использующих
sorted(glob.glob('*.png'))
меня, не работает, список вывода по-прежнему не упорядочен по их именам.Тем не менее,
sorted(glob.glob('*.png'), key=os.path.getmtime)
работает отлично.Я немного запутался, как сортировка по их именам здесь не работает.
Спасибо @Martin Thoma за публикацию этого замечательного вопроса и @Johan La Rooy за полезные решения.
источник
Пожалуйста, попробуйте этот код:
источник
Вот как я сделал мой конкретный случай. Надеюсь, это полезно.
источник