Search code examples
pythonfilesystemsglobfnmatch

How can I search sub-folders using glob.glob module?


I want to open a series of subfolders in a folder and find some text files and print some lines of the text files. I am using this:

configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')

But this cannot access the subfolders as well. Does anyone know how I can use the same command to access subfolders as well?


Solution

  • In Python 3.5 and newer use the new recursive **/ functionality:

    configfiles = glob.glob('C:/Users/sam/Desktop/file1/**/*.txt', recursive=True)
    

    When recursive is set, ** followed by a path separator matches 0 or more subdirectories.

    In earlier Python versions, glob.glob() cannot list files in subdirectories recursively.

    In that case I'd use os.walk() combined with fnmatch.filter() instead:

    import os
    import fnmatch
    
    path = 'C:/Users/sam/Desktop/file1'
    
    configfiles = [os.path.join(dirpath, f)
        for dirpath, dirnames, files in os.walk(path)
        for f in fnmatch.filter(files, '*.txt')]
    

    This'll walk your directories recursively and return all absolute pathnames to matching .txt files. In this specific case the fnmatch.filter() may be overkill, you could also use a .endswith() test:

    import os
    
    path = 'C:/Users/sam/Desktop/file1'
    
    configfiles = [os.path.join(dirpath, f)
        for dirpath, dirnames, files in os.walk(path)
        for f in files if f.endswith('.txt')]