Как это питоны Глоб.Глоб заказал?
я написал следующий код 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
он не упорядочен по имени файла или размеру.
7 ответов:
он, вероятно, не сортируется вообще и использует порядок, в котором записи появляются в файловой системе, т. е. тот, который вы получаете при использовании
ls -U. (По крайней мере, на моей машине это производит тот же порядок, что и листингglobматчи).
порядок произвольный, но вы можете сортировать их самостоятельно
Если вы хотите сортировать по названию:
sorted(glob.glob('*.png'))сортировка по времени модификации:
import os sorted(glob.glob('*.png'), key=os.path.getmtime)сортировка по размеру:
import os sorted(glob.glob('*.png'), key=os.path.getsize)etc.
проверяя исходный код
glob.globвы видите, что он внутренне называетos.listdir, описано здесь:http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir
ключевая фраза: ОС.listdir(путь) Возвращает список, содержащий имена записей в каталоге, заданном путем. Список в произвольном порядке. Он не включает в себя специальные записи '.' и.' . даже если они присутствуют в справочник.
произвольном порядке. :)
Глоб.glob () - это оболочка вокруг ОС.listdir () таким образом, базовая ОС отвечает за доставку данных. В общем: вы не можете сделать предположение о заказе здесь. Основное предположение:нет заказ. Если вам нужна сортировка: сортировка на уровне приложения.
у меня была аналогичная проблема,
globвозвращал список имен файлов в произвольном порядке, но я хотел пройти через них в числовом порядке, как указано в имени файла. Вот как я этого добился:Мои файлы были возвращены
globчто-то типа:myList = ["c:\tmp\x3.csv", "c:\tmp\x.csv", "c:\tmp\x1.csv", "c:\tmp\x2.csv", "c:\tmp\x.csv"]я отсортировал список на месте, для этого я создал функцию:
def sortKeyFunc(s): return int(os.path.basename(s)[:-4])эта функция возвращает числовую часть имени файла и преобразует ее в целое число.Затем я назвал сорт метод в списке как таковой:
myList.sort(key=sortKeyFunc)это вернуло список как таковой:
["c:\tmp\x.csv", "c:\tmp\x.csv", "c:\tmp\x1.csv", "c:\tmp\x2.csv", "c:\tmp\x3.csv"]
пожалуйста, попробуйте этот код:
sorted(glob.glob( os.path.join(path, '*.png') ),key=lambda x:float(re.findall("([0-9]+?)\.png",x)[0]))
'''my file name is "0_male_0.wav", "0_male_2.wav"... "0_male_30.wav"... "1_male_0.wav", "1_male_2.wav"... "1_male_30.wav"... "8_male_0.wav", "8_male_2.wav"... "8_male_30.wav" when I wav.read(files) I want to read them in a sorted torder, i.e., "0_male_0.wav" "0_male_1.wav" "0_male_2.wav" ... "0_male_30.wav" "1_male_0.wav" "1_male_1.wav" "1_male_2.wav" ... "1_male_30.wav" so this is how I did it. Just take all files start with "0_*" as an example. Others you can just put it in a loop ''' import scipy.io.wavfile as wav import glob from os.path import isfile, join #get all the file names in file_names. THe order is totally messed up file_names = [f for f in listdir(audio_folder_dir) if isfile(join(audio_folder_dir, f)) and '.wav' in f] #find files that belongs to "0_*" group filegroup0 = glob.glob(audio_folder_dir+'/0_*') #now you get sorted files in group '0_*' by the last number in the filename filegroup0 = sorted(filegroup0, key=getKey) def getKey(filename): file_text_name = os.path.splitext(os.path.basename(filename)) #you get the file's text name without extension file_last_num = os.path.basename(file_text_name[0]).split('_') #you get three elements, the last one is the number. You want to sort it by this number return int(file_last_num[2])вот как я сделал свой конкретный случай. Надеюсь, это поможет.
Comments