Spaces:
No application file
No application file
| import os | |
| from typing import Tuple, Callable, Dict | |
| from functools import partial | |
| def get_file_name_ext(basename: str) -> Tuple[str, str]: | |
| """分离文件名和后缀,适用于复杂命名的分离,目前支持 | |
| 含.的名字 | |
| Args: | |
| basename (str): xx.xxx.xx.ext | |
| Returns: | |
| Tuple[str, str]: name, ext | |
| """ | |
| ext = basename.split(".")[-1] | |
| name = ".".join(basename.split(".")[:-1]) | |
| return name, ext | |
| def get_dir_file_map( | |
| path, split_func=None, filter_func: Callable = None, exts: list = None | |
| ) -> dict: | |
| """遍历目标文件夹及子文件夹下所有符合后缀目标的文件,生成字典。 | |
| split_func 可以用于对文件名做处理生成想要的字典key。 | |
| Args: | |
| path (str): 目标文件夹 | |
| split_func (__call__, optional): 可以用于对文件名做处理生成想要的字典key。. Defaults to None. | |
| exts (list, optional): 目标文件后缀, 例如["mp3", "json"]. Defaults to None. | |
| Returns: | |
| dict: key是处理后的文件名,值是绝对路径 | |
| """ | |
| dct = {} | |
| for rootdir, dirnames, basenames in os.walk(path): | |
| for basename in basenames: | |
| path = os.path.join(rootdir, basename) | |
| if filter_func is not None: | |
| if not filter_func(path): | |
| continue | |
| if split_func is None: | |
| ext = basename.split(".")[-1] | |
| filename = ".".join(basename.split(".")[:-1]) | |
| else: | |
| filename, ext = split_func(basename) | |
| if exts is None: | |
| dct[filename] = path | |
| else: | |
| if ext.lower() in exts: | |
| dct[filename] = path | |
| return dct | |
| def get_path_dct(path, exts, mode: int=1, split_func: Callable=None, sep: str="@") -> Dict[str, str]: | |
| """遍历目标文件夹及子文件夹下所有视频文件,生成字典。""" | |
| if mode == 1: | |
| dct = get_dir_file_map(path, exts=exts) | |
| elif mode == 2: | |
| dct = get_dir_file_map(path, split_func=split_func, exts=exts) | |
| elif mode== 3: | |
| dct = get_path_dct(path, mode=1, sep=sep, exts=exts) | |
| dct2 = get_path_dct(path, mode=2, sep=sep, split_func=split_func, exts=exts) | |
| dct.update(**dct2) | |
| else: | |
| raise ValueError("only support mode 1, 2, 3") | |
| return dct | |