18

What is the simplest way to get the full recursive list of files inside a folder with python? I know about os.walk(), but it seems overkill for just getting the unfiltered list of all files. Is it really the only option?

dreftymac
  • 31,404
  • 26
  • 119
  • 182
static_rtti
  • 53,760
  • 47
  • 136
  • 192
  • Does this answer your question? [Recursive sub folder search and return files in a list python](https://stackoverflow.com/questions/18394147/recursive-sub-folder-search-and-return-files-in-a-list-python) – Tomerikoo Nov 16 '21 at 15:08

7 Answers7

19

There's nothing preventing you from creating your own function:

import os

def listfiles(folder):
    for root, folders, files in os.walk(folder):
        for filename in folders + files:
            yield os.path.join(root, filename)

You can use it like so:

for filename in listfiles('/etc/'):
    print filename
Lauritz V. Thaulow
  • 49,139
  • 12
  • 73
  • 92
Blender
  • 289,723
  • 53
  • 439
  • 496
13

os.walk() is not overkill by any means. It can generate your list of files and directories in a jiffy:

files = [os.path.join(dirpath, filename)
    for (dirpath, dirs, files) in os.walk('.')
    for filename in (dirs + files)]

You can turn this into a generator, to only process one path at a time and safe on memory.

Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
3

You could also use the find program itself from Python by using sh

import sh
text_files = sh.find(".", "-iname", "*.txt")
amoffat
  • 696
  • 4
  • 12
2

pathlib.Path.rglob is pretty simple. It lists the entire directory tree

(The argument is a filepath search pattern. "*" means list everything)

import pathlib


for path in pathlib.Path("directory_to_list/").rglob("*"):
    print(path)
Miłosz Łakomy
  • 996
  • 5
  • 12
1

Either that or manually recursing with isdir() / isfile() and listdir() or you could use subprocess.check_output() and call find .. Bascially os.walk() is highest level, slightly lower level is semi-manual solution based on listdir() and if you want the same output find . would give you for some reason you can make a system call with subprocess.

kgr
  • 9,750
  • 2
  • 38
  • 43
1

os.walk() is hard to use, just kick it and use pathlib instead.

Here is a python function mimicking a similar function of list.files in R language.

def list_files(path,pattern,full_names=False,recursive=True):
    if(recursive):
        files=pathlib.Path(path).rglob(pattern)
    else:
        files=pathlib.Path(path).glob(pattern)

    if full_names:
        files=[str(f) for f in files]
    else:
        files=[f.name for f in files]
    return(files)
HuoJnx
  • 11
  • 1
0
import os
path = "path/to/your/dir"
for (path, dirs, files) in os.walk(path):
    print files

Is this overkill, or am I missing something?

verbsintransit
  • 888
  • 3
  • 8
  • 18