"""
This module provides utilities for file handling, specifically for walking through directories
and retrieving file paths. It includes a function to recursively search for files in a specified
directory based on a given pattern.
The primary function is `walk_files`, which allows users to easily obtain relative paths of all
files within a directory structure, making it useful for file management tasks, data processing,
and more.
"""
import glob
import os
from typing import Iterator, Optional
[docs]def walk_files(directory: str, pattern: Optional[str] = None, ) -> Iterator[str]:
"""
Recursively walk through a directory and yield relative paths of all files.
This function takes a directory path and a pattern to search for files. It uses the `glob`
module to find all files that match the specified pattern within the directory and its
subdirectories. The yielded paths are relative to the specified directory.
:param directory: The root directory to start walking.
:type directory: str
:param pattern: The pattern to match files against, defaults to ``**/*`` which matches all files.
:type pattern: str
:return: An iterator that yields relative paths of all files in the directory.
:rtype: Iterator[str]
:example:
>>> for file in walk_files('/path/to/directory'):
... print(file)
"""
for path in glob.glob(os.path.abspath(os.path.join(directory, pattern or os.path.join('**', '*'))), recursive=True):
if os.path.isfile(path):
yield os.path.relpath(path, start=os.path.abspath(directory))