(精品)根据文件夹内的txt文本标题处理文件夹MJ数据

发布时间 2023-12-19 10:53:49作者: 不上火星不改名

功能介绍

这个脚本是一个自动化的文件重命名工具,专门用于重命名图片文件。其主要功能如下:

  1. 深度遍历指定目录:脚本能够遍历指定目录下的所有子文件夹,进行深度搜索。

  2. 检测文本文件作为命名前缀:对于每个子文件夹,脚本会查找第一个.txt文件,并使用其文件名(不包括扩展名.txt)作为图片文件的命名前缀。

  3. 智能图片重命名:

    • 对于文件名看似乱码或不含下划线的图片,脚本会简化其名称并编号(如“(1)”, “(2)”等)。
    • 对于其他图片,脚本会删除文件名中不需要的部分,如特定的无关字符或数字,并在保留有效部分的同时加上从txt文件中获取的前缀。
  4. 避免命名冲突:如果重命名的文件名已存在,脚本会自动在文件名后加上括号内的数字(如“(1)”, “(2)”等)以避免重复。

使用条件

  • Python 环境:需要在支持Python的环境中运行,确保Python版本至少为Python 3.x。
  • 操作系统:适用于大多数操作系统,包括Windows、macOS和Linux。

使用注意事项

  1. 备份文件:在执行脚本之前,建议对所有相关文件进行备份,以防止意外的文件重命名或数据丢失。

  2. 目录权限:确保你有足够的权限访问和修改指定目录及其子目录下的文件。

  3. 避免中断:脚本运行过程中避免中断操作,以免部分文件被重命名而其他文件未处理,导致文件命名不一致。

  4. 检查文件类型:脚本只对图片文件进行重命名,确保目标文件夹中不包含非图片文件,或者这些文件的命名对你而言不重要。

  5. 检查文本文件:确保每个子文件夹中只有一个txt文件用于命名,且其名称适合作为文件前缀。

  6. 编码问题:如果脚本在处理特定文件名时遇到编码问题,可能需要调整脚本以适应特定的文件名编码方式。

  7. 测试运行:在大规模使用之前,先在一个小规模的、包含少量文件的文件夹上测试脚本,以确保它按照预期工作。

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()