os.walk嵌套列表理解

Uri*_*Uri 8 python list-comprehension

试图枚举某个目录中的所有文件(如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)]
Run Code Online (Sandbox Code Playgroud)

不幸的是,对于最后一个表达式,我得到:

NameError: name 'files' is not defined

问题相关,哪个(虽然有效)我无法理解嵌套列表理解的语法.

Mar*_*ers 18

你需要反转嵌套;

allfiles = [join(root,f) for root,dirs,files in walk(root) for f in files]
Run Code Online (Sandbox Code Playgroud)

请参阅列表理解文档:

当提供列表推导时,它由一个表达式后跟至少一个for子句和零个或多个forif子句组成.在这种情况下,新列表的元素是通过将每个forif子句视为块,从左到右嵌套,以及每次到达最内部块时评估表达式以产生列表元素而生成的元素.

换句话说,既然你基本上想要道德等同于:

allfiles = []
for root, dirs, files in walk(root):
    for f in files:
        allfiles.append(f)
Run Code Online (Sandbox Code Playgroud)

你的列表理解应遵循相同的顺序.


Sil*_*ost 5

它是:

allfiles = [join(root, f) for _, dirs, files in walk(root) for f in files]
Run Code Online (Sandbox Code Playgroud)