166

私はよくpythonを使ってデータのディレクトリを処理しています。最近、リストのデフォルトの順序がほとんど無意味なものに変更されていることに気付きました。たとえば、run01、run02、... run19、run20 というサブディレクトリを含む現在のディレクトリにいる場合、次のコマンドからリストを生成します。

dir = os.listdir(os.getcwd())

次に、通常、次の順序でリストを取得します。

dir = ['run01', 'run18', 'run14', 'run13', 'run12', 'run11', 'run08', ... ]

等々。順序は以前は英数字でした。しかし、この新しい秩序はしばらくの間私に残っています。

これらのリストの (表示される) 順序を決定しているのは何ですか?

4

14 に答える 14

190

組み込み関数を使用して、sorted必要に応じて文字列を並べ替えることができます。あなたが説明した内容に基づいて、

sorted(os.listdir(whatever_directory))

.sortまたは、リストのメソッドを使用できます。

lst = os.listdir(whatever_directory)
lst.sort()

私はトリックを行うべきだと思います。

os.listdirファイル名を取得する順序は、おそらくファイルシステムに完全に依存することに注意してください。

于 2013-02-21T13:35:36.980 に答える
81

順序は、FileSystem でファイルがインデックス化される方法に関係していると思います。本当にある順序に準拠させたい場合は、ファイルを取得した後、いつでもリストを並べ替えることができます。

于 2011-01-27T05:41:17.017 に答える
53

ドキュメントごと:

os.listdir(パス)

パスで指定されたディレクトリ内のエントリの名前を含むリストを返します。リストは任意の順序です。特別なエントリ「.」は含まれません。および「..」は、ディレクトリに存在する場合でも。

順序は当てにできず、ファイルシステムのアーティファクトです。

結果をソートするには、 を使用しますsorted(os.listdir(path))

于 2011-01-27T07:26:22.083 に答える
5

おそらく、C'sreaddir()が返す順序です。次の C プログラムを実行してみてください。

#include <dirent.h>
#include <stdio.h>

int main(void){
   DIR *dirp;
   struct dirent* de;
   dirp = opendir(".");
   while(de = readdir(dirp)) // Yes, one '='.
        printf("%s\n", de->d_name);
   closedir(dirp);
   return 0;
}

ビルド行は次のようになりgcc -o foo foo.cます。

PSこれとあなたのPythonコードを実行したところ、どちらもソートされた出力が得られたため、表示されているものを再現できません.

于 2011-01-27T05:46:27.843 に答える
3

os.listdirコマンドとコマンドの提案された組み合わせは、 Linux でのコマンドsortedと同じ結果を生成します。ls -l次の例は、この仮定を検証します。

user@user-PC:/tmp/test$ touch 3a 4a 5a b c d1 d2 d3 k l p0 p1 p3 q 410a 409a 408a 407a
user@user-PC:/tmp/test$ ls -l
total 0
-rw-rw-r-- 1 user user 0 Feb  15 10:31 3a
-rw-rw-r-- 1 user user 0 Feb  15 10:31 407a
-rw-rw-r-- 1 user user 0 Feb  15 10:31 408a
-rw-rw-r-- 1 user user 0 Feb  15 10:31 409a
-rw-rw-r-- 1 user user 0 Feb  15 10:31 410a
-rw-rw-r-- 1 user user 0 Feb  15 10:31 4a
-rw-rw-r-- 1 user user 0 Feb  15 10:31 5a
-rw-rw-r-- 1 user user 0 Feb  15 10:31 b
-rw-rw-r-- 1 user user 0 Feb  15 10:31 c
-rw-rw-r-- 1 user user 0 Feb  15 10:31 d1
-rw-rw-r-- 1 user user 0 Feb  15 10:31 d2
-rw-rw-r-- 1 user user 0 Feb  15 10:31 d3
-rw-rw-r-- 1 user user 0 Feb  15 10:31 k
-rw-rw-r-- 1 user user 0 Feb  15 10:31 l
-rw-rw-r-- 1 user user 0 Feb  15 10:31 p0
-rw-rw-r-- 1 user user 0 Feb  15 10:31 p1
-rw-rw-r-- 1 user user 0 Feb  15 10:31 p3
-rw-rw-r-- 1 user user 0 Feb  15 10:31 q

user@user-PC:/tmp/test$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.listdir( './' )
['d3', 'k', 'p1', 'b', '410a', '5a', 'l', 'p0', '407a', '409a', '408a', 'd2', '4a', 'p3', '3a', 'q', 'c', 'd1']
>>> sorted( os.listdir( './' ) )
['3a', '407a', '408a', '409a', '410a', '4a', '5a', 'b', 'c', 'd1', 'd2', 'd3', 'k', 'l', 'p0', 'p1', 'p3', 'q']
>>> exit()
user@user-PC:/tmp/test$ 

ls -lしたがって、 Python コードでよく知られたコマンドの結果を再現したい人にとっては、sorted( os.listdir( DIR ) )かなりうまく機能します。

于 2017-02-15T08:45:15.890 に答える
2

「ソート」が常に期待どおりに機能するとは限らないことがわかりました。たとえば、次のようなディレクトリがあり、「並べ替え」により非常に奇妙な結果が得られます。

>>> os.listdir(pathon)
['2', '3', '4', '5', '403', '404', '407', '408', '410', '411', '412', '413', '414', '415', '416', '472']
>>> sorted([ f for f in os.listdir(pathon)])
['2', '3', '4', '403', '404', '407', '408', '410', '411', '412', '413', '414', '415', '416', '472', '5']

最初の文字が最初に比較されるようで、それが最大の場合は最後の文字になります。

于 2014-01-29T07:37:29.113 に答える
0
In [6]: os.listdir?

Type:       builtin_function_or_method
String Form:<built-in function listdir>
Docstring:
listdir(path) -> list_of_strings
Return a list containing the names of the entries in the directory.
path: path of directory to list
The list is in **arbitrary order**.  It does not include the special
entries '.' and '..' even if they are present in the directory.
于 2013-02-21T13:36:54.977 に答える