| import os |
| import fnmatch |
| import warnings |
| from typing import List, Union, Iterable |
| |
| |
| def match_masks(name : str, masks : Union[str, List[str]]) -> bool: |
| # empty mask matches any input name |
| if not masks: |
| return True |
| |
| if isinstance(masks, str): |
| return fnmatch.fnmatch(name, masks) |
| |
| for mask in masks: |
| if fnmatch.fnmatch(name, mask): |
| return True |
| return False |
| |
| |
| def get_file_pathnames_from_root( |
| root: str, |
| masks: Union[str, List[str]], |
| recursive: bool = False, |
| abspath: bool = False) -> Iterable[str]: |
| |
| # print out an error message and raise the error out |
| def onerror(err : OSError): |
| warnings.warn(err.filename + " : " + err.strerror) |
| raise err |
| |
| for path, dirs, files in os.walk(root, onerror=onerror): |
| if abspath: |
| path = os.path.abspath(path) |
| for f in files: |
| if match_masks(f, masks): |
| yield os.path.join(path, f) |
| if not recursive: |
| break |
| |
| |
| def get_file_binaries_from_pathnames(pathnames : Iterable): |
| |
| if not isinstance(pathnames, Iterable): |
| warnings.warn("get_file_binaries_from_pathnames needs the input be an Iterable") |
| raise TypeError |
| |
| for pathname in pathnames: |
| if not isinstance(pathname, str): |
| warnings.warn("file pathname must be string type, but got {}".format(type(pathname))) |
| raise TypeError |
| |
| yield (pathname, open(pathname, 'rb')) |