Directory-tree listing in Python


How do I get a list of all files (and directories) in a given directory in Python?

Asked By: Matt



You can use


For reference and more os functions look here:

Answered By: rslite
import os

for filename in os.listdir("C:\temp"):
    print  filename
Answered By: curtisk

Try this:

import os
for top, dirs, files in os.walk('./'):
    for nm in files:       
        print os.path.join(top, nm)
Answered By: paxdiablo

This is a way to traverse every file and directory in a directory tree:

import os

for dirname, dirnames, filenames in os.walk('.'):
    # print path to all subdirectories first.
    for subdirname in dirnames:
        print(os.path.join(dirname, subdirname))

    # print path to all filenames.
    for filename in filenames:
        print(os.path.join(dirname, filename))

    # Advanced usage:
    # editing the 'dirnames' list will stop os.walk() from recursing into there.
    if '.git' in dirnames:
        # don't go into any .git directories.
Answered By: Jerub

Here’s a helper function I use quite often:

import os

def listdir_fullpath(d):
    return [os.path.join(d, f) for f in os.listdir(d)]
Answered By: giltay

I wrote a long version, with all the options I might need:

I guess it will fit here too:

#!/usr/bin/env python

import os
import sys

def ls(dir, hidden=False, relative=True):
    nodes = []
    for nm in os.listdir(dir):
        if not hidden and nm.startswith('.'):
        if not relative:
            nm = os.path.join(dir, nm)
    return nodes

def find(root, files=True, dirs=False, hidden=False, relative=True, topdown=True):
    root = os.path.join(root, '')  # add slash if not there
    for parent, ldirs, lfiles in os.walk(root, topdown=topdown):
        if relative:
            parent = parent[len(root):]
        if dirs and parent:
            yield os.path.join(parent, '')
        if not hidden:
            lfiles   = [nm for nm in lfiles if not nm.startswith('.')]
            ldirs[:] = [nm for nm in ldirs  if not nm.startswith('.')]  # in place
        if files:
            for nm in lfiles:
                nm = os.path.join(parent, nm)
                yield nm

def test(root):
    print "* directory listing, with hidden files:"
    print ls(root, hidden=True)
    print "* recursive listing, with dirs, but no hidden files:"
    for f in find(root, dirs=True):
        print f

if __name__ == "__main__":
Answered By: Sam Watkins

If you need globbing abilities, there’s a module for that as well. For example:

import glob

will return something like:

['./1.gif', './2.txt']

See the documentation here.

Answered By: kenny
#import modules
import os


def rec_tree_traverse(curr_dir, indent):
    "recurcive function to traverse the directory"
    #print "[traverse_tree]"

    try :
        dfList = [os.path.join(curr_dir, f_or_d) for f_or_d in os.listdir(curr_dir)]
        print "wrong path name/directory name"

    for file_or_dir in dfList:

        if os.path.isdir(file_or_dir):
            #print "dir  : ",
            print indent, file_or_dir,"\"
            rec_tree_traverse(file_or_dir, indent*2)

        if os.path.isfile(file_or_dir):
            #print "file : ",
            print indent, file_or_dir

    #end if for loop
#end of traverse_tree()

def main():

    base_dir = _CURRENT_DIR

    rec_tree_traverse(base_dir," ")

    raw_input("enter any key to exit....")
#end of main()

if __name__ == '__main__':
Answered By: Alok

FYI Add a filter of extension or ext file
import os

path = '.'
for dirname, dirnames, filenames in os.walk(path):
    # print path to all filenames with extension py.
    for filename in filenames:
        fname_path = os.path.join(dirname, filename)
        fext = os.path.splitext(fname_path)[1]
        if fext == '.py':
            print fname_path
Answered By: moylop260

A nice one liner to list only the files recursively. I used this in my package_data directive:

import os

[os.path.join(x[0],y) for x in os.walk('<some_directory>') for y in x[2]]

I know it’s not the answer to the question, but may come in handy

Answered By: fivetentaylor

A recursive implementation

import os

def scan_dir(dir):
    for name in os.listdir(dir):
        path = os.path.join(dir, name)
        if os.path.isfile(path):
            print path

If figured I’d throw this in. Simple and dirty way to do wildcard searches.

import re
import os

[a for a in os.listdir(".") if"^.*.py$",a)]
Answered By: bng44270

For files in current working directory without specifying a path

Python 2.7:

import os

Python 3.x:

import os
Answered By: Dave Engineer

For Python 2


import os

def scan_dir(path):
    print map(os.path.abspath, os.listdir(pwd))

For Python 3

For filter and map, you need wrap them with list()


import os

def scan_dir(path):
    print(list(map(os.path.abspath, os.listdir(pwd))))

The recommendation now is that you replace your usage of map and filter with generators expressions or list comprehensions:


import os

def scan_dir(path):
    print([os.path.abspath(f) for f in os.listdir(path)])
Answered By: Alejandro Blasco

Below code will list directories and the files within the dir

def print_directory_contents(sPath):
        import os                                       
        for sChild in os.listdir(sPath):                
            sChildPath = os.path.join(sPath,sChild)
            if os.path.isdir(sChildPath):

Here is a one line Pythonic version:

import os
dir = 'given_directory_name'
filenames = [os.path.join(os.path.dirname(os.path.abspath(__file__)),dir,i) for i in os.listdir(dir)]

This code lists the full path of all files and directories in the given directory name.

Answered By: salehinejad

I know this is an old question. This is a neat way I came across if you are on a liunx machine.

import subprocess
print(subprocess.check_output(["ls", "/"]).decode("utf8"))
Answered By: apeter

The one worked with me is kind of a modified version from Saleh’s answer elsewhere on this page.

The code is as follows:

dir = 'given_directory_name'
filenames = [os.path.abspath(os.path.join(dir,i)) for i in os.listdir(dir)]
Answered By: HassanSh__3571619

Here is another option.


It returns an iterator of os.DirEntry objects corresponding to the entries (along with file attribute information) in the directory given by path.


with os.scandir(path) as it:
    for entry in it:
        if not'.'):

Using scandir() instead of listdir() can significantly increase the performance of code that also needs file type or file attribute information, because os.DirEntry objects expose this information if the operating system provides it when scanning a directory. All os.DirEntry methods may perform a system call, but is_dir() and is_file() usually only require a system call for symbolic links; os.DirEntry.stat() always requires a system call on Unix but only requires one for symbolic links on Windows.

Python Docs

Answered By: Khaino

While os.listdir() is fine for generating a list of file and dir names, frequently you want to do more once you have those names – and in Python3, pathlib makes those other chores simple. Let’s take a look and see if you like it as much as I do.

To list dir contents, construct a Path object and grab the iterator:

In [16]: Path('/etc').iterdir()
Out[16]: <generator object Path.iterdir at 0x110853fc0>

If we want just a list of names of things:

In [17]: [ for x in Path('/etc').iterdir()]

If you want just the dirs:

In [18]: [ for x in Path('/etc').iterdir() if x.is_dir()]

If you want the names of all conf files in that tree:

In [20]: [ for x in Path('/etc').glob('**/*.conf')]

If you want a list of conf files in the tree >= 1K:

In [23]: [ for x in Path('/etc').glob('**/*.conf') if x.stat().st_size > 1024]

Resolving relative paths become easy:

In [32]: Path('../Operational').resolve()
Out[32]: PosixPath('/Users/starver/code/xxxx/Operational')

Navigating with a Path is pretty clear (although unexpected):

In [10]: p = Path('.')

In [11]: core = p / 'web' / 'core'

In [13]: [x for x in core.iterdir() if x.is_file()]
Answered By: Steve Tarver

Easiest way:

list_output_files = [os.getcwd()+"\"+f for f in os.listdir(os.getcwd())]
Answered By: Manav Patadia