1. ホーム
  2. python

os.walk iteratesはどのような順序で反復するのでしょうか?[重複しています]

2023-08-31 07:41:53

質問

で指定されたファイルやディレクトリの順序が気になります。 os.walk() . もし私がこれらのディレクトリを持っているとしたら。 1 , 10 , 11 , 12 , 2 , 20 , 21 , 22 , 3 , 30 , 31 , 32 のように、出力リストの順番はどうなるのでしょうか?

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

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

あるいは、ASCII 値でソートされ、以下のようになります。 ls ?

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

さらに、特定のソートを取得するにはどうしたらよいでしょうか?

どのように解決するのですか?

os.walk 使用方法 os.listdir . 以下は os.listdir :

listdir(path) -> 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)

(ディレクトリ名はint型ではなく文字列であることに注意してください。 sorted(dirs) はそれらを文字列としてソートします -- これは一旦は望ましいことです。

AlfeとCiro Santilliが指摘しているように、もしディレクトリを 再帰的 をソートされた順番で表示させたいのであれば dirs その場で :

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):

英数字の文字列を並べ替えるには ナチュラルソート .