in easycv/file/file_io.py [0:0]
def listdir(self,
path,
recursive=False,
full_path=False,
contains: Union[str, List[str]] = None):
"""
List all objects in path. Same usage as `os.listdir`.
Example:
from easycv.file import io
io.access_oss(your oss config) # only oss file need, refer to `IO.access_oss`
ret = io.listdir('oss://bucket/dir', recursive=True)
print(ret)
Args:
path: local file path or oss path.
recursive: If False, only list the top level objects.
If True, recursively list all objects.
full_path: if full path, return files with path prefix.
contains: substr to filter list files.
return: A list of path.
"""
from oss2 import ObjectIterator
if not is_oss_path(path):
return super().listdir(path, recursive, full_path, contains)
bucket, path = self._get_bucket_obj_and_path(path)
path = self._correct_oss_dir(path)
files = [
obj.key for obj in ObjectIterator(
bucket, prefix=path, delimiter='' if recursive else '/')
]
if path in files:
files.remove(path)
if recursive:
files = [
i for i in files
if not self.isdir(f'{OSS_PREFIX}{bucket.bucket_name}/{i}')
]
if not files and not self._obj_exists(bucket, path):
raise FileNotFoundError(
f'No such directory: {OSS_PREFIX}{bucket.bucket_name}/{path}')
if full_path:
files = [
f'{OSS_PREFIX}{bucket.bucket_name}/{file}' for file in files
]
else:
files = [file[len(path):] for file in files]
if not contains:
return files
if isinstance(contains, str):
contains = [contains]
files = [
file for file in files
if any(keyword in file for keyword in contains)
]
return files