os.walk嵌套列表理解

时间:2012-10-24 14:53:33

标签: python list-comprehension

尝试枚举某个目录中的所有文件(例如,在Linux中找到。'或在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

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

2 个答案:

答案 0 :(得分:17)

您需要反转嵌套;

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

请参阅list comprehension documentation

  

提供列表推导时,它包含一个表达式,后跟至少一个for子句和零个或多个forif子句。在这种情况下,新列表的元素是通过将每个forif子句视为一个块,从左到右嵌套,并评估表达式以生成列表而生成的元素。每次到达最里面的块时都会元素。

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

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

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

答案 1 :(得分:5)

它是:

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