import sys import os import glob import argparse def get_parser(**parser_kwargs): parser = argparse.ArgumentParser(**parser_kwargs) parser.add_argument( "--img_dir", type=str, nargs="?", const=True, default="input", help="directory with images to be renamed", ), parser.add_argument( "--find", type=str, nargs="?", const=True, default=None, help="what strings to replace, in csv format, default: 'a man,a woman,a person'", ), parser.add_argument( "--replace", type=str, nargs="?", required=False, const=True, default=None, help="string to replace with, ex. 'john doe'", ), parser.add_argument( "--append_only", type=str, nargs="?", required=False, const=True, default=None, help="skips pronoun replace, adds a string at the end of the filename, use for 'by artist name' or 'in the style of somestyle'", ) return parser def isWindows(): return sys.platform.startswith('win') def get_replace_list(opt): if opt.find is None: return ("a man", "a woman", "a person", \ "a girl", "a boy", \ "a young woman", "a young man", \ "a beautiful woman", "a handsome man", \ "a beautiful young woman", "a handsome young man", ) else: return opt.find.split(",") def get_outfile_name(infile, append): new_filename = f"{os.path.splitext(infile)[0]} {append}{os.path.splitext(infile)[1]}" return new_filename def rename_files(opt): find_list = get_replace_list(opt) for idx, file in enumerate(glob.iglob(f"{opt.img_dir}/*")): print(file) if os.path.splitext(file)[1] in (".jpg", ".png", ".jpeg", ".gif", ".bmp", ".webp"): new_filename = file if opt.append_only is not None: new_filename = get_outfile_name(file, opt.append_only) else: for s in find_list: if s in file: new_filename = new_filename.replace(s, opt.replace) try: print(f"Renaming {file} to {new_filename}") if os.path.exists(new_filename): new_filename = new_filename = get_outfile_name(file, f"_{idx}") print(f"filename already exists, appended '_n' to {new_filename}") try: os.rename(file, new_filename) except Exception as e: print(f"Error renaming file: {file}, skipping, error: {e}") except Exception as e: print(f"error opening file: {file}") print(f"{e}") raise e if __name__ == "__main__": parser = get_parser() opt = parser.parse_args() import time s = time.perf_counter() rename_files(opt) elapsed = time.perf_counter() - s print(f"{__file__} executed in {elapsed:0.2f} seconds.")