from pathlib import Path from django.core.files.storage import default_storage def walk_folder(storage, base="/", error_handler=None): """ Recursively walks a folder, using Django's File Storage. :param storage: :param base: The base folder :param error_handler: :yields: A tuple of base, subfolders, files """ try: folders, files = storage.listdir(base) except OSError as e: logger.exception("An error occurred while walking directory %s", base) if error_handler: error_handler(e) return for subfolder in folders: # On S3, we don't really have subfolders, so exclude "." if subfolder == ".": continue new_base = str(Path(base, subfolder)) for f in walk_folder(storage, new_base): yield f yield base, folders, files for base, subfolders, files in walk_folder(default_storage, "some_folder"): print(base, subfolders, files)