
def json_dump_with_depth(data,indent=0,depth=0,level=0):
    import json
    if depth==0:
        return json.dumps(data)
    backslash_char = "\n"
    indent_char=backslash_char+' '*indent*(1+level)
    if isinstance(data, dict):
        subjsonstrs=[f'"{key}": {json_dump_with_depth(data[key],indent,depth-1,level+1)}' for key in data.keys()]
        sep=f",{'' if indent<=0 else indent_char}"
        json_str="{%s}"%(f"{indent_char}{sep.join(subjsonstrs)}{backslash_char+' '*indent*(level)}")
        return json_str
    if isinstance(data, list):
        subjsonstrs=[f"{json_dump_with_depth(value,indent,depth-1,level+1)}" for value in data]
        sep=f",{' ' if indent<=0 else indent_char}"
        json_str=f"[{indent_char}{sep.join(subjsonstrs)}{backslash_char+' '*indent*(level)}]"
        return json_str
    return json.dumps(data)

def load_json(json_path: str):
    import json
    with open(json_path, "r") as f:
        data = json.load(f)
    return data

def save_json(data: dict, json_path: str, indent=1):
    import json
    with open(json_path, "w") as f:
        json.dump(data, f,ensure_ascii=False,indent=indent)

def load_pickle(path):
    import pickle
    with open(path,'rb') as f:
        data=pickle.load(f)
    return data

def save_pickle(data, path):
    import pickle
    with open(path,'wb') as f:
        pickle.dump(data,f)

def load_yaml(path):
    import yaml
    with open(path,'r') as f:
        data=yaml.load(f, Loader=yaml.FullLoader)
    return data

def secure_filename(filename: str) -> str:
    import unicodedata
    import os
    import re
    from werkzeug.utils import _windows_device_files
    '''
    An improved version of werkzeug.utils.secure_filename, add support for Chinese Charactors
    '''
    filename = unicodedata.normalize("NFKD", filename)
    filename = filename.encode("utf8", "ignore").decode("utf8")   # 编码格式改变
    for sep in os.path.sep, os.path.altsep:
        if sep:
            filename = filename.replace(sep, " ")
    _filename_ascii_add_strip_re = re.compile(r'[^A-Za-z0-9_\u4E00-\u9FBF\u3040-\u30FF\u31F0-\u31FF.-]')
    filename = str(_filename_ascii_add_strip_re.sub('', '_'.join(filename.split()))).strip('._')             # 添加新规则
    if (
        os.name == "nt"
        and filename
        and filename.split(".")[0].upper() in _windows_device_files
    ):
        filename = f"_{filename}"
    return filename

def uniqueSecureFilename(filePath):
    from pathlib import Path
    filePath=Path(filePath)
    fileStem=filePath.stem
    fileSuffix=filePath.suffix
    fileParent=filePath.parent
    secureStem=secure_filename(fileStem)
    newFilePath=fileParent / f"{secureStem}{fileSuffix}"
    index=0
    while newFilePath.exists():
        index+=1
        stem_i=f"{secureStem}_{index}"
        newFilePath=fileParent / f"{stem_i}{fileSuffix}"
    return str(newFilePath)

def findFileIn(path,*extensions):
    all_files = []
    for ext in extensions:
        all_files.extend(path.glob(ext))
    return all_files