2011-07-21 22 views
86

我寫了下面的Python代碼:Pythons glob.glob是如何訂購的?

#!/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 

它不是由文件名或大小排序。

其他鏈接:globls

+2

最終的答案似乎是,在'ls'命令本身的名字排序文件。 'ls -U'以「目錄順序」給出無序的文件列表。 –

回答

55

它可能不是在所有排序,並使用在該條目出現在文件系統中的順序,即一個你使用ls -U時得到的。 (至少在我的機器上,這產生與列表glob匹配相同的順序)。

11

glob.glob()是圍繞os.listdir一個包裝(),因此墊層OS負責用於遞送數據。一般來說:你不能在這裏訂購。基本假設是:沒有排序。如果你需要一些排序:在應用程序級別排序。

34

通過檢查glob.glob的源代碼,你看到它內部調用os.listdir,這裏描述:

http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir

關鍵句:os.listdir(路徑) 返回包含的條目名稱的列表在路徑給出的目錄中。該列表以任意順序排列。它不包括特殊條目''。'和'..',即使它們存在於目錄中。

任意訂單。 :)

215

順序是任意的,但你可以自己

對它們進行排序。如果你想按名稱排序:

sorted(glob.glob('*.png')) 

通過修改時間排序:

import os 
sorted(glob.glob('*.png'), key=os.path.getmtime) 

按大小排序:

import os 
sorted(glob.glob('*.png'), key=os.path.getsize) 

+0

我有文件,其中名稱只是整數,沒有擴展名,所以我使用:'files = glob.glob('teksty/*')'。將被nam授予的訂單? – andi

+7

+1回答問題OP真的要問:) – mgalgs

+0

@gnibbler你是我的英雄 –

-3
'''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]) 

這就是我做我的具體情況。希望這是有幫助的。

+1

你應該改變你的答案以適應這個問題。 – CodenameLambda

+1

問題不在於排序。我知道(當時我知道)如何排序。問題是關於默認的順序。 –

+1

感謝您使用此代碼段,它可能會提供一些即時幫助。通過展示*爲什麼*這是一個很好的解決方案,對未來的讀者會有更好的解決方案,這將爲它的教育價值提供一個合適的解釋[//大大提高](// meta.stackexchange.com/q/114762)但不完全相同的問題。請編輯您的答案以添加解釋,並指出適用的限制和假設。 –

2

我有一個類似的問題,glob正在以任意順序返回文件名列表,但我想按照文件名所示的數字順序遍歷它們。這是我如何實現它:

我的文件由glob類似返回:

myList = ["c:\tmp\x\123.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\12.csv"] 

我排序的名單到位,要做到這一點我創建了一個功能:

def sortKeyFunc(s): 
    return int(os.path.basename(s)[:-4]) 

這函數返回文件名的數字部分並將其轉換爲整數。然後在列表中調用排序方法,如下所示:

myList.sort(key=sortKeyFunc) 

這返回的列表,例如:

["c:\tmp\x\12.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\123.csv"]