import os import shutil from ._registry import method_files_map try: import appdirs except ImportError: appdirs = None def _clear_cache(datasets, cache_dir=None, method_map=None): if method_map is None: # Use SciPy Datasets method map method_map = method_files_map if cache_dir is None: # Use default cache_dir path if appdirs is None: # appdirs is pooch dependency raise ImportError("Missing optional dependency 'pooch' required " "for scipy.datasets module. Please use pip or " "conda to install 'pooch'.") cache_dir = appdirs.user_cache_dir("scipy-data") if not os.path.exists(cache_dir): print(f"Cache Directory {cache_dir} doesn't exist. Nothing to clear.") return if datasets is None: print(f"Cleaning the cache directory {cache_dir}!") shutil.rmtree(cache_dir) else: if not isinstance(datasets, (list, tuple)): # single dataset method passed should be converted to list datasets = [datasets, ] for dataset in datasets: assert callable(dataset) dataset_name = dataset.__name__ # Name of the dataset method if dataset_name not in method_map: raise ValueError(f"Dataset method {dataset_name} doesn't " "exist. Please check if the passed dataset " "is a subset of the following dataset " f"methods: {list(method_map.keys())}") data_files = method_map[dataset_name] data_filepaths = [os.path.join(cache_dir, file) for file in data_files] for data_filepath in data_filepaths: if os.path.exists(data_filepath): print("Cleaning the file " f"{os.path.split(data_filepath)[1]} " f"for dataset {dataset_name}") os.remove(data_filepath) else: print(f"Path {data_filepath} doesn't exist. " "Nothing to clear.") def clear_cache(datasets=None): """ Cleans the scipy datasets cache directory. If a scipy.datasets method or a list/tuple of the same is provided, then clear_cache removes all the data files associated to the passed dataset method callable(s). By default, it removes all the cached data files. Parameters ---------- datasets : callable or list/tuple of callable or None Examples -------- >>> from scipy import datasets >>> ascent_array = datasets.ascent() >>> ascent_array.shape (512, 512) >>> datasets.clear_cache([datasets.ascent]) Cleaning the file ascent.dat for dataset ascent """ _clear_cache(datasets)