2011-07-21 14 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を使用しているときあなたが得る、すなわち1を使用していません。 (少なくとも私のマシンでは、これはリストglobがマッチするのと同じ順序を作ります)。

11

glob.glob()は、os.listdir()を包むラッパーであり、下位OSがデータを配信するようになっています。一般的には、ここで注文することはできません。基本的な仮定は、なしです。並べ替えが必要な場合:アプリケーションレベルでソートします。あなたはそれが内部的にos.listdirを呼び出すことがわかりglob.globのソースコードをチェックすることにより

34

は、ここで説明:

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

キーセンテンス:os.listdir(パス)は、エントリの名前を含むリストを返します pathで指定されたディレクトリに格納します。リストは任意の順序です。特別なエントリ ''は含まれていません。ディレクトリに存在していても '..'と表示されます。

任意の順。 :)

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は本当に質問するつもりでした:) – 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]) 

この関数はファイル名の数値部分を返し、整数に変換します。次にリストのsortメソッドを呼び出します。

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"] 
関連する問題