功能介绍
这个脚本是一个自动化的文件重命名工具,专门用于重命名图片文件。其主要功能如下:
-
深度遍历指定目录:脚本能够遍历指定目录下的所有子文件夹,进行深度搜索。
-
检测文本文件作为命名前缀:对于每个子文件夹,脚本会查找第一个
.txt
文件,并使用其文件名(不包括扩展名.txt
)作为图片文件的命名前缀。 -
智能图片重命名:
- 对于文件名看似乱码或不含下划线的图片,脚本会简化其名称并编号(如“(1)”, “(2)”等)。
- 对于其他图片,脚本会删除文件名中不需要的部分,如特定的无关字符或数字,并在保留有效部分的同时加上从txt文件中获取的前缀。
-
避免命名冲突:如果重命名的文件名已存在,脚本会自动在文件名后加上括号内的数字(如“(1)”, “(2)”等)以避免重复。
使用条件
- Python 环境:需要在支持Python的环境中运行,确保Python版本至少为Python 3.x。
- 操作系统:适用于大多数操作系统,包括Windows、macOS和Linux。
使用注意事项
-
备份文件:在执行脚本之前,建议对所有相关文件进行备份,以防止意外的文件重命名或数据丢失。
-
目录权限:确保你有足够的权限访问和修改指定目录及其子目录下的文件。
-
避免中断:脚本运行过程中避免中断操作,以免部分文件被重命名而其他文件未处理,导致文件命名不一致。
-
检查文件类型:脚本只对图片文件进行重命名,确保目标文件夹中不包含非图片文件,或者这些文件的命名对你而言不重要。
-
检查文本文件:确保每个子文件夹中只有一个txt文件用于命名,且其名称适合作为文件前缀。
-
编码问题:如果脚本在处理特定文件名时遇到编码问题,可能需要调整脚本以适应特定的文件名编码方式。
-
测试运行:在大规模使用之前,先在一个小规模的、包含少量文件的文件夹上测试脚本,以确保它按照预期工作。
import os import re UNWANTED_UNITS = ["undefined", "皮皮", "zly324"] IMAGE_EXTENSIONS = [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff"] # 检查文件是否为图片 def is_image_file(filename): _, ext = os.path.splitext(filename) return ext.lower() in IMAGE_EXTENSIONS # 获取文件夹内第一个txt文件的名称(不包括扩展名) def get_first_txt_title(path): try: for file in os.listdir(path): if file.endswith(".txt"): return os.path.splitext(file)[0] except Exception as e: print(f"在'{path}'检查txt文件时发生错误:{e}") return None # 生成唯一的新文件名 def generate_unique_filename(path, filename, ext): new_file_path = os.path.join(path, filename + ext) counter = 1 while os.path.exists(new_file_path): new_file_path = os.path.join(path, f"{filename}({counter}){ext}") counter += 1 return new_file_path # 重命名图片文件 def rename_image_files(path, prefix): if not prefix: # 如果没有找到txt文件或文件夹中没有txt文件 print(f"在'{path}'中未找到txt文件或txt文件为空,跳过重命名操作。") return try: files = [f for f in os.listdir(path) if is_image_file(f) and os.path.isfile(os.path.join(path, f))] counter = 1 for file in files: filename, ext = os.path.splitext(file) # 乱码类 if re.search(r'[a-f0-9]{32}', filename) or not '_' in filename: renamed = f"({counter})" counter += 1 else: parts = re.split(r'[_]+', filename) parts.pop(0) # 删除第一个单元 # 删除特定的单元 parts = [part for part in parts if part not in UNWANTED_UNITS] # 删除所有带数字的单元 parts = [part for part in parts if not any(char.isdigit() for char in part)] # 删除特定规则的元素 while parts and re.search(r'^[a-f0-9\-]{32,}$', parts[-1]): parts.pop(-1) while parts and len(parts[-1]) <= 4: parts.pop(-1) renamed = '_'.join(parts) # 添加前缀 renamed = f"{prefix}_{renamed}" # 生成唯一的文件名 new_file_path = generate_unique_filename(path, renamed, ext) os.rename(os.path.join(path, file), new_file_path) print(f"在'{path}'中重命名完成。") except Exception as e: print(f"在'{path}'中重命名过程中发生错误:{e}") # 遍历并重命名子文件夹中的图片文件 def rename_images_in_subfolders(root_path): for subdir, dirs, _ in os.walk(root_path): prefix = get_first_txt_title(subdir) if prefix: rename_image_files(subdir, prefix) # 主函数 def main(): root_path = input("请输入总文件夹地址: ") rename_images_in_subfolders(root_path) if __name__ == "__main__": main()
标签:文件夹,文件,MJ,parts,file,path,txt,os From: https://www.cnblogs.com/zly324/p/17913166.html