File size: 2,353 Bytes
6755a2d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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