mirror of
https://github.com/aigc3d/LAM_Audio2Expression.git
synced 2026-02-04 17:39:24 +08:00
feat: Initial commit
This commit is contained in:
105
utils/path.py
Normal file
105
utils/path.py
Normal file
@@ -0,0 +1,105 @@
|
||||
"""
|
||||
The code is base on https://github.com/Pointcept/Pointcept
|
||||
"""
|
||||
import os
|
||||
import os.path as osp
|
||||
from pathlib import Path
|
||||
|
||||
from .misc import is_str
|
||||
|
||||
|
||||
def is_filepath(x):
|
||||
return is_str(x) or isinstance(x, Path)
|
||||
|
||||
|
||||
def fopen(filepath, *args, **kwargs):
|
||||
if is_str(filepath):
|
||||
return open(filepath, *args, **kwargs)
|
||||
elif isinstance(filepath, Path):
|
||||
return filepath.open(*args, **kwargs)
|
||||
raise ValueError("`filepath` should be a string or a Path")
|
||||
|
||||
|
||||
def check_file_exist(filename, msg_tmpl='file "{}" does not exist'):
|
||||
if not osp.isfile(filename):
|
||||
raise FileNotFoundError(msg_tmpl.format(filename))
|
||||
|
||||
|
||||
def mkdir_or_exist(dir_name, mode=0o777):
|
||||
if dir_name == "":
|
||||
return
|
||||
dir_name = osp.expanduser(dir_name)
|
||||
os.makedirs(dir_name, mode=mode, exist_ok=True)
|
||||
|
||||
|
||||
def symlink(src, dst, overwrite=True, **kwargs):
|
||||
if os.path.lexists(dst) and overwrite:
|
||||
os.remove(dst)
|
||||
os.symlink(src, dst, **kwargs)
|
||||
|
||||
|
||||
def scandir(dir_path, suffix=None, recursive=False, case_sensitive=True):
|
||||
"""Scan a directory to find the interested files.
|
||||
|
||||
Args:
|
||||
dir_path (str | obj:`Path`): Path of the directory.
|
||||
suffix (str | tuple(str), optional): File suffix that we are
|
||||
interested in. Default: None.
|
||||
recursive (bool, optional): If set to True, recursively scan the
|
||||
directory. Default: False.
|
||||
case_sensitive (bool, optional) : If set to False, ignore the case of
|
||||
suffix. Default: True.
|
||||
|
||||
Returns:
|
||||
A generator for all the interested files with relative paths.
|
||||
"""
|
||||
if isinstance(dir_path, (str, Path)):
|
||||
dir_path = str(dir_path)
|
||||
else:
|
||||
raise TypeError('"dir_path" must be a string or Path object')
|
||||
|
||||
if (suffix is not None) and not isinstance(suffix, (str, tuple)):
|
||||
raise TypeError('"suffix" must be a string or tuple of strings')
|
||||
|
||||
if suffix is not None and not case_sensitive:
|
||||
suffix = (
|
||||
suffix.lower()
|
||||
if isinstance(suffix, str)
|
||||
else tuple(item.lower() for item in suffix)
|
||||
)
|
||||
|
||||
root = dir_path
|
||||
|
||||
def _scandir(dir_path, suffix, recursive, case_sensitive):
|
||||
for entry in os.scandir(dir_path):
|
||||
if not entry.name.startswith(".") and entry.is_file():
|
||||
rel_path = osp.relpath(entry.path, root)
|
||||
_rel_path = rel_path if case_sensitive else rel_path.lower()
|
||||
if suffix is None or _rel_path.endswith(suffix):
|
||||
yield rel_path
|
||||
elif recursive and os.path.isdir(entry.path):
|
||||
# scan recursively if entry.path is a directory
|
||||
yield from _scandir(entry.path, suffix, recursive, case_sensitive)
|
||||
|
||||
return _scandir(dir_path, suffix, recursive, case_sensitive)
|
||||
|
||||
|
||||
def find_vcs_root(path, markers=(".git",)):
|
||||
"""Finds the root directory (including itself) of specified markers.
|
||||
|
||||
Args:
|
||||
path (str): Path of directory or file.
|
||||
markers (list[str], optional): List of file or directory names.
|
||||
|
||||
Returns:
|
||||
The directory contained one of the markers or None if not found.
|
||||
"""
|
||||
if osp.isfile(path):
|
||||
path = osp.dirname(path)
|
||||
|
||||
prev, cur = None, osp.abspath(osp.expanduser(path))
|
||||
while cur != prev:
|
||||
if any(osp.exists(osp.join(cur, marker)) for marker in markers):
|
||||
return cur
|
||||
prev, cur = cur, osp.split(cur)[0]
|
||||
return None
|
||||
Reference in New Issue
Block a user