尝试枚举某个目录中的所有文件(例如,在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问题相关,哪个(虽然有效)我无法理解嵌套列表理解的语法。
答案 0 :(得分:17)
您需要反转嵌套;
allfiles = [join(root,f) for root,dirs,files in walk(root) for f in files]
请参阅list comprehension documentation:
提供列表推导时,它包含一个表达式,后跟至少一个
for
子句和零个或多个for
或if
子句。在这种情况下,新列表的元素是通过将每个for
或if
子句视为一个块,从左到右嵌套,并评估表达式以生成列表而生成的元素。每次到达最里面的块时都会元素。
换句话说,既然你基本上想要道德等同于:
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]