0

In https://stackoverflow.com/a/33135143 the solution for returning recursively all file names in a directory structure looks like depicted below.

I need also the information about each sub directory in the directory structure and the full path name of the files and directories. So if I have this structure:

ls -1 -R
.:
a
b

./a:
fileC

./b:

I would need:

/a
/b
/a/fileC

How do I have to change the solution from the answer stated above to achieve this? For the sake of completion, the answer is given below:

try:
    from os import scandir
except ImportError:
    from scandir import scandir  # use scandir PyPI module on Python < 3.5

def scantree(path):
    """Recursively yield DirEntry objects for given directory."""
    for entry in scandir(path):
        if entry.is_dir(follow_symlinks=False):
            yield from scantree(entry.path)  # see below for Python 2.x
        else:
            yield entry

if __name__ == '__main__':
    import sys
    for entry in scantree(sys.argv[1] if len(sys.argv) > 1 else '.'):
        print(entry.path)
7824238
  • 388
  • 4
  • 14

1 Answers1

2

You should yield the current entry whether or not it's a directory. If it's a directory, you also recurse to get the contents.

def scantree(path):
    """Recursively yield DirEntry objects for given directory."""
    for entry in scandir(path):
        yield entry
        if entry.is_dir(follow_symlinks=False):
            yield from scantree(entry.path)
Barmar
  • 741,623
  • 53
  • 500
  • 612