Mastering Python: How to List Files in a Directory

Updated on May 15, 2026
Table of Contents
    The Solution

    In Python, you can list files in a directory using modules like os, glob, and pathlib, each offering unique methods and advantages.

    The Concept

    Listing files in a directory is a common task in Python, and there are several ways to achieve this using different modules like os, glob, and pathlib. Each method has its own use cases and advantages, depending on the complexity of the directory structure and the specific requirements of the task.

    Deep Technical Dive & Misconceptions

    The os module provides basic directory listing capabilities with functions like os.listdir(), os.walk(), and os.scandir(). These functions are straightforward and efficient for simple directory structures. However, they may not be the best choice for complex recursive directory traversals.

    The glob module excels at pattern matching, allowing you to list files that match specific patterns using wildcards. This is particularly useful for filtering files by extension or name pattern.

    The pathlib module, introduced in Python 3.4, offers an object-oriented approach to handling filesystem paths. It provides methods like .iterdir() and .rglob() for directory traversal, which are more intuitive and powerful for recursive operations.

    Common Misconceptions

    • Using os.listdir() alone will list both files and directories, so additional filtering is needed to isolate files.
    • glob patterns do not match hidden files (those starting with a dot) unless explicitly specified.
    • pathlib methods like .rglob() are often more efficient for recursive directory traversal compared to manually implementing recursion with os methods.

    Code Examples

    import os
    
    # List all files in a directory
    path = "/path/to/directory"
    files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
    print("Files:", files)
    import glob
    
    # List all .txt files in a directory
    files = glob.glob("/path/to/directory/*.txt")
    print("Text files:", files)
    import os
    
    # Use os.walk to list all files recursively
    for root, dirs, files in os.walk("/path/to/directory"):
        for file in files:
            print(os.path.join(root, file))
    from pathlib import Path
    
    # List all files in a directory using pathlib
    path = Path("/path/to/directory")
    files = [f for f in path.iterdir() if f.is_file()]
    print("Files:", files)
    from pathlib import Path
    
    # Recursively list all .md files using pathlib
    path = Path("/path/to/directory")
    files = list(path.rglob("*.md"))
    print("Markdown files:", files)

    Comparison Table

    Method Module Recursive Pattern Matching
    os.listdir() os No No
    os.walk() os Yes No
    glob.glob() glob Optional Yes
    pathlib.iterdir() pathlib No No
    pathlib.rglob() pathlib Yes Yes

    Frequently Asked Questions

    What is the difference between os.listdir() and os.walk()?

    os.listdir() lists all files and directories in a given directory without recursion, while os.walk() traverses directories recursively, providing a list of all files and directories in the directory tree.

    How can I list only files, excluding directories?

    You can filter the results of os.listdir() or pathlib.iterdir() by checking if each item is a file using os.path.isfile() or Path.is_file(), respectively.

    Can I use glob to list hidden files?

    By default, glob does not match hidden files (those starting with a dot). To include them, you must explicitly specify patterns that match hidden files, such as .*.

    What is the advantage of using pathlib over os for file operations?

    pathlib provides an object-oriented approach to filesystem paths, making code more readable and intuitive, especially for complex directory operations.

    Is there a performance difference between glob and pathlib for recursive listing?

    For simple recursive listings, glob can be faster due to its optimized pattern matching. However, pathlib offers more flexibility and readability, especially when combined with additional filtering logic.

    Was this solution helpful?
    Report Broken Code or Error

    Help us improve. Paste the error you got or explain what went wrong.

    Thanks! We will review and fix this.

    Related Questions

    Comments & Discussions

    Log in or Sign up to join the discussion.