75

で指定されたファイルとディレクトリの順序が気になりますos.walk()。これらのディレクトリがある場合、, , , , 1, 10, 11, 12, 2,20出力リストの順序は?21223303132

数値でソートされていますか?

1 2 3 10 20 30 11 21 31 12 22 32

lsまたは、 ?によって与えられるもののように、ASCII 値でソートします。

1 10 11 12 2 20 21 22 3 30 31 32

さらに、特定の並べ替えを取得するにはどうすればよいですか?

4

3 に答える 3

114

os.walkを使用しos.listdirます。のドキュメント文字列は次のとおりですos.listdir

listdir(パス) -> list_of_strings

ディレクトリ内のエントリの名前を含むリストを返します。

path: path of directory to list

リストは任意の順序です。特別なエントリ「.」は含まれません。および「..」は、ディレクトリに存在する場合でも。

(私の強調)。

ただし、sort希望する順序を確保するために使用できます。

for root, dirs, files in os.walk(path):
   for dirname in sorted(dirs):
        print(dirname)

(dirnames は int ではなく文字列であるためsorted(dirs)、文字列としてソートすることに注意してください。

Alfe と Ciro Santilli が指摘しているように、ディレクトリをソート順に再帰させたい場合はdirs 、 in-placeを変更します。

for root, dirs, files in os.walk(path):
   dirs.sort()
   for dirname in dirs:
        print(os.path.join(root, dirname))

これを自分でテストできます:

import os

os.chdir('/tmp/tmp')
for dirname in '1 10 11 12 2 20 21 22 3 30 31 32'.split():
     try:
          os.makedirs(dirname)
     except OSError: pass


for root, dirs, files in os.walk('.'):
   for dirname in sorted(dirs):
        print(dirname)

版画

1
10
11
12
2
20
21
22
3
30
31
32

それらを番号順にリストしたい場合は、次を使用します。

for dirname in sorted(dirs, key=int):

英数字文字列を並べ替えるには、自然な並べ替えを使用します。

于 2013-08-16T21:29:25.673 に答える
46

os.walk()各ステップで、次のステップで何をするかが決まります。リストを好きなように並べ替えることで、各ステップで次のステップの順序に影響を与えることができます。2.7マニュアルの引用:

topdown が True の場合、呼び出し元は dirnames リストをインプレースで変更でき (おそらく del または slice 割り当てを使用)、walk() は名前が dirnames に残っているサブディレクトリにのみ再帰します。これを使用して検索を絞り込み、特定の訪問順序を課すことができます

したがって、dirNames意志を並べ替えると、それらが訪問される順序に影響します。

for rootName, dirNames, fileNames in os.walk(path):
  dirNames.sort()  # you may want to use the args cmp, key and reverse here

この後、 はそのdirNames場でソートされ、次の生成walkされる値はそれに応じて になります。

もちろん、リストを並べ替えることもできますfileNamesが、それ以降の手順には影響しません (子孫walkを持たないファイルはアクセスされるため)。

もちろん、unutbuの回答が提案するように、これらのリストのソートされたバージョンを反復処理できますが、walkそれ自体のさらなる進行には影響しません。

値の変更されていない順序は によって未定義ですos.walk。つまり、「任意の」順序になります。今日の経験に頼るべきではありません。しかし実際には、それはおそらく基盤となるファイル システムが返すものです。一部のファイル システムでは、これはアルファベット順に並べられます。

于 2013-08-16T21:47:02.280 に答える
44

最も簡単な方法は、の戻り値をソートすることですos.walk()。たとえば、次のように使用します。

for rootName, dirNames, fileNames in sorted(os.walk(path)):
    #root, dirs and files are iterated in order... 
于 2015-09-16T12:15:28.437 に答える