|
from pathlib import Path |
|
from os import scandir |
|
|
|
image_extensions = [".jpg", ".jpeg", ".png", ".tif", ".tiff"] |
|
|
|
def write_bytes_safe(p, bytes_data): |
|
""" |
|
writes to .tmp first and then rename to target filename |
|
""" |
|
p_tmp = p.parent / (p.name + '.tmp') |
|
p_tmp.write_bytes(bytes_data) |
|
if p.exists(): |
|
p.unlink() |
|
p_tmp.rename (p) |
|
|
|
def scantree(path): |
|
"""Recursively yield DirEntry objects for given directory.""" |
|
for entry in scandir(path): |
|
if entry.is_dir(follow_symlinks=False): |
|
yield from scantree(entry.path) |
|
else: |
|
yield entry |
|
|
|
def get_image_paths(dir_path, image_extensions=image_extensions, subdirs=False, return_Path_class=False): |
|
dir_path = Path (dir_path) |
|
|
|
result = [] |
|
if dir_path.exists(): |
|
|
|
if subdirs: |
|
gen = scantree(str(dir_path)) |
|
else: |
|
gen = scandir(str(dir_path)) |
|
|
|
for x in list(gen): |
|
if any([x.name.lower().endswith(ext) for ext in image_extensions]): |
|
result.append( x.path if not return_Path_class else Path(x.path) ) |
|
return sorted(result) |
|
|
|
def get_image_unique_filestem_paths(dir_path, verbose_print_func=None): |
|
result = get_image_paths(dir_path) |
|
result_dup = set() |
|
|
|
for f in result[:]: |
|
f_stem = Path(f).stem |
|
if f_stem in result_dup: |
|
result.remove(f) |
|
if verbose_print_func is not None: |
|
verbose_print_func ("Duplicate filenames are not allowed, skipping: %s" % Path(f).name ) |
|
continue |
|
result_dup.add(f_stem) |
|
|
|
return sorted(result) |
|
|
|
def get_paths(dir_path): |
|
dir_path = Path (dir_path) |
|
|
|
if dir_path.exists(): |
|
return [ Path(x) for x in sorted([ x.path for x in list(scandir(str(dir_path))) ]) ] |
|
else: |
|
return [] |
|
|
|
def get_file_paths(dir_path): |
|
dir_path = Path (dir_path) |
|
|
|
if dir_path.exists(): |
|
return [ Path(x) for x in sorted([ x.path for x in list(scandir(str(dir_path))) if x.is_file() ]) ] |
|
else: |
|
return [] |
|
|
|
def get_all_dir_names (dir_path): |
|
dir_path = Path (dir_path) |
|
|
|
if dir_path.exists(): |
|
return sorted([ x.name for x in list(scandir(str(dir_path))) if x.is_dir() ]) |
|
else: |
|
return [] |
|
|
|
def get_all_dir_names_startswith (dir_path, startswith): |
|
dir_path = Path (dir_path) |
|
startswith = startswith.lower() |
|
|
|
result = [] |
|
if dir_path.exists(): |
|
for x in list(scandir(str(dir_path))): |
|
if x.name.lower().startswith(startswith): |
|
result.append ( x.name[len(startswith):] ) |
|
return sorted(result) |
|
|
|
def get_first_file_by_stem (dir_path, stem, exts=None): |
|
dir_path = Path (dir_path) |
|
stem = stem.lower() |
|
|
|
if dir_path.exists(): |
|
for x in sorted(list(scandir(str(dir_path))), key=lambda x: x.name): |
|
if not x.is_file(): |
|
continue |
|
xp = Path(x.path) |
|
if xp.stem.lower() == stem and (exts is None or xp.suffix.lower() in exts): |
|
return xp |
|
|
|
return None |
|
|
|
def move_all_files (src_dir_path, dst_dir_path): |
|
paths = get_file_paths(src_dir_path) |
|
for p in paths: |
|
p = Path(p) |
|
p.rename ( Path(dst_dir_path) / p.name ) |
|
|
|
def delete_all_files (dir_path): |
|
paths = get_file_paths(dir_path) |
|
for p in paths: |
|
p = Path(p) |
|
p.unlink() |
|
|