How to find a file using Python?

In some applications, we need to find files on our computer programmatically to save time. Python provides several powerful libraries to search and locate files, making this task straightforward and efficient. In this article, we'll explore different methods to find files in our system using Python.

Using the os Module

The os module provides os.walk(), which searches for files in directories and their subdirectories. This method returns file paths in a directory, allowing you to search for specific files.

Example

Here's how to use os.walk() to find a specific file ?

import os

def find_file(filename, search_path):
    for dirpath, dirnames, filenames in os.walk(search_path):
        if filename in filenames:
            return os.path.join(dirpath, filename)
    return None

# Create a test directory structure
os.makedirs("test_dir/subfolder", exist_ok=True)
with open("test_dir/file1.txt", "w") as f:
    f.write("Sample content")

# Find the file
filename = 'file1.txt'
found_file = find_file(filename, "test_dir")

if found_file:
    print(f"File found at: {found_file}")
else:
    print("File not found")
File found at: test_dir/file1.txt

Using glob Module

The glob module provides glob.glob() to search for files matching a specified pattern. It uses special characters and wildcards, making it particularly useful for matching files with specific extensions or naming patterns.

Example

Here's how to find all '.txt' files recursively using glob ?

import glob
import os

# Create test files
os.makedirs("test_dir/subfolder", exist_ok=True)
with open("test_dir/file1.txt", "w") as f:
    f.write("Content 1")
with open("test_dir/file2.txt", "w") as f:
    f.write("Content 2")
with open("test_dir/subfolder/file3.txt", "w") as f:
    f.write("Content 3")

# Find all .txt files recursively
search_pattern = "test_dir/**/*.txt"
files = glob.glob(search_pattern, recursive=True)

if files:
    print(f"Found files: {files}")
else:
    print("No files found")
Found files: ['test_dir/file1.txt', 'test_dir/file2.txt', 'test_dir/subfolder/file3.txt']

Using fnmatch Module

The fnmatch module provides fnmatch.fnmatch() for matching filenames using shell-style wildcards. It's useful when you need to match filenames with specific patterns like finding all files with a '.txt' extension or files starting with a specific prefix.

Example

Here's how to use fnmatch.fnmatch() to match filenames based on patterns ?

import fnmatch
import os

def find_files(pattern, search_path):
    matched_files = []
    for filename in os.listdir(search_path):
        if fnmatch.fnmatch(filename, pattern):
            matched_files.append(filename)
    return matched_files

# Create test files
os.makedirs("test_dir", exist_ok=True)
with open("test_dir/document.txt", "w") as f:
    f.write("Document")
with open("test_dir/image.jpg", "w") as f:
    f.write("Image")
with open("test_dir/report.txt", "w") as f:
    f.write("Report")

# Find all .txt files
pattern = '*.txt'
matched_files = find_files(pattern, "test_dir")

if matched_files:
    print(f"Found files: {matched_files}")
else:
    print("No files found")
Found files: ['document.txt', 'report.txt']

Using pathlib.rglob() Method

The pathlib module's Path.rglob() method provides recursive file searching. This modern approach is part of the Path class and is useful for searching files matching specific patterns within directories and subdirectories.

Example

Here's how to use pathlib.Path.rglob() to recursively search for '.txt' files ?

from pathlib import Path

def find_files(pattern, search_path):
    search_path = Path(search_path)
    matched_files = list(search_path.rglob(pattern))
    return matched_files

# Create test directory structure
Path("test_dir/subfolder").mkdir(parents=True, exist_ok=True)
Path("test_dir/config.txt").write_text("Config data")
Path("test_dir/readme.txt").write_text("Readme content")
Path("test_dir/subfolder/notes.txt").write_text("Notes")

# Find all .txt files
pattern = '*.txt'
matched_files = find_files(pattern, "test_dir")

if matched_files:
    print(f"Found files: {matched_files}")
else:
    print("No files found")
Found files: [PosixPath('test_dir/config.txt'), PosixPath('test_dir/readme.txt'), PosixPath('test_dir/subfolder/notes.txt')]

Comparison of Methods

Method Best For Recursive Search Pattern Matching
os.walk() Finding specific files Yes Manual
glob.glob() Pattern-based searching Yes (with **) Built-in
fnmatch Shell-style wildcards Manual Yes
pathlib.rglob() Modern Python approach Yes Built-in

Conclusion

Python offers multiple approaches for file searching. Use pathlib.rglob() for modern Python applications, glob.glob() for pattern matching, and os.walk() for complex search logic with full control over the traversal process.

Updated on: 2026-03-24T18:24:04+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements