python在一个文件夹下按照规则替换所有文件名

import os
import re

# 定义 Windows 非法文件名字符的正则表达式
# 包括常见的非法符号和 ASCII 控制字符 (\x00-\x1F)
INVALID_CHARS_PATTERN = r'[<>:"/\\|?*\x00-\x1F]'


def clean_filename(filename):
    """
    清洗文件名,去除所有 Windows 不允许的特殊字符和控制字符。
    """
    # 替换所有非法字符为空字符串
    cleaned_name = re.sub(INVALID_CHARS_PATTERN, '', filename)

    # 移除文件名开头和结尾的点号和空格
    cleaned_name = cleaned_name.strip(' .')

    return cleaned_name


def rename_specific_file_safe(directory_path, old_filename_pattern, new_filename_pattern):
    """
    安全地在指定的目录下,将匹配特定模式的文件名重命名,并处理非法字符。
    """
    print(f"--- 开始处理目录: {directory_path} ---")

    if not os.path.exists(directory_path):
        print(f"❌ 错误:指定的目录 '{directory_path}' 不存在。请检查路径是否正确。")
        return

    try:
        # 遍历目录下的所有文件和文件夹
        for filename in os.listdir(directory_path):

            # 假设您要重命名的文件是 '006 Getting the Most out of the Course--[koudaizy.com]_en.srt'
            # 并且它可能被不可见字符污染了。

            # --- 阶段 A: 文件名清洗 ---
            cleaned_filename = clean_filename(filename)

            # 如果原始文件名中包含非法字符(即清洗后有变化)
            if filename != cleaned_filename:
                old_filepath = os.path.join(directory_path, filename)
                temp_filepath = os.path.join(directory_path, cleaned_filename)

                try:
                    # 先将原始的包含非法字符的文件名重命名为清洗后的名称
                    os.rename(old_filepath, temp_filepath)
                    print(f"🔄 警告:检测到非法字符。已将 '{filename}' 清洗为 '{cleaned_filename}'")
                    filename = cleaned_filename  # 更新当前处理的文件名
                    # 注意:如果文件被成功清洗重命名,那么我们就可以继续执行目标重命名操作
                except Exception as e:
                    # 如果清洗重命名失败,则打印错误并跳过此文件
                    print(f"❌ 清洗重命名失败 (文件: {filename}): {e}")
                    continue

            # --- 阶段 B: 执行您要求的重命名逻辑 ---
            match = re.search(old_filename_pattern, filename)

            if match:
                # 构建新的文件名 (将匹配到的 "_en.srt" 替换为 ".srt")
                new_filename = re.sub(old_filename_pattern, new_filename_pattern, filename)

                old_filepath = os.path.join(directory_path, filename)
                new_filepath = os.path.join(directory_path, new_filename)

                # 执行最终重命名操作
                os.rename(old_filepath, new_filepath)

                print(f"✅ 成功重命名文件:")
                print(f"   旧名称: {filename}")
                print(f"   新名称: {new_filename}")
                # 如果只重命名一个文件,可以在这里 break
                # break

        print("--- 目录处理完毕 ---")

    except Exception as e:
        print(f"❌ 发生未知错误: {e}")


# --- 配置参数 (请仔细修改以下路径和模式) ---

# 1. 目标目录路径
#    **请替换为您要操作的 `.srt` 文件所在的实际文件夹路径!**
#    例如,如果文件是 C:\my_course\006.srt,那么 target_directory 就是 r'C:\my_course'
target_directory = r'C:\baidunetdiskdownload\kicad-like-a-pro-3e\01 - Introduction'  # 示例路径,请修改!

# 2. 重命名逻辑(保持您原有的逻辑)
pattern_to_find = r'_en.bilingual\.srt$'
replacement_pattern = r'.srt'

# --- 执行功能 ---
rename_specific_file_safe(target_directory, pattern_to_find, replacement_pattern)

 

posted @ 2026-04-07 14:30  漫漫长路</>  阅读(4)  评论(0)    收藏  举报