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)