13

特定のディレクトリ内のすべてのファイルを列挙しようとしています(Linuxでは「find。」、Windowsでは「dir / s / b」など)。

私は次のネストされたリスト内包表記を思いついた:

from os import walk
from os.path import join
root = r'c:\windows'      #choose any folder here
allfiles = [join(root,f) for f in files for root,dirs,files in walk(root)]

残念ながら、最後の式については、次のようになります。

NameError: name 'files' is not defined

この質問に関連して、(機能しているものの)ネストされたリスト内包表記の構文を理解できません。

4

2 に答える 2

27

ネストを逆にする必要があります。

allfiles = [join(root,f) for root,dirs,files in walk(root) for f in files]

リスト内包表記のドキュメントを参照してください。

リスト内包表記が指定されている場合、リスト内包表記は、単一の式とそれに続く少なくとも1つのfor節と0個以上のfororif節で構成されます。この場合、新しいリストの要素は、各fororif句をブロックと見なし、左から右にネストし、式を評価して最も内側のブロックに到達するたびにリスト要素を生成することによって生成される要素です。

言い換えれば、あなたは基本的に次の道徳的同等物が欲しいので:

allfiles = []
for root, dirs, files in walk(root):
    for f in files:
        allfiles.append(f)

リスト内包表記は同じ順序に従う必要があります。

于 2012-10-24T14:55:23.567 に答える
5

それは:

allfiles = [join(root, f) for _, dirs, files in walk(root) for f in files]
于 2012-10-24T14:55:19.633 に答える