nested list comprehension with os.walk

list-comprehension, python

Solution

You need to reverse the nesting;

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

See the list comprehension documentation:

When a list comprehension is supplied, it consists of a single expression followed by at least one `for` clause and zero or more `for` or `if` clauses. In this case, the elements of the new list are those that would be produced by considering each of the `for` or `if` clauses a block, nesting from left to right, and evaluating the expression to produce a list element each time the innermost block is reached.

In other words, since you basically want the moral equivalent of:

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

your list comprehension should follow the same ordering.

Problem

Trying to enumerate all files in a certain directory (like 'find .' in Linux, or 'dir /s /b' in Windows). I came up with the following nested list comprehension: ``` 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)] ``` Unfortunately, for the last expression, I'm getting: `NameError: name 'files' is not defined` Related to this question, which (although working) I can't understand the syntax of the nested list comprehension.

Original source

Related problems