如何批量重命名特定命名模式的文件夹文件?脚本仅改部分文件求助
解决PDB文件批量重命名仅部分成功的问题
可能导致仅部分文件重命名成功的原因
- 重复目标文件名:如果多个原文件拆分后得到相同的蛋白ID(即
parts[1]),重命名时会因目标文件已存在抛出异常,导致这类文件被跳过 - 文件名匹配逻辑局限:原脚本的
startswith和endswith匹配,无法处理文件名存在大小写差异(如.PDB结尾)或中间额外-字符的情况 - 潜在的目录遍历问题:虽然
os.listdir会先获取完整文件列表,但如果脚本运行中有其他程序修改目录,可能导致部分文件未被处理
改进后的重命名脚本
import os import re directory = r'\\...' # 替换为你的目标目录路径 # 先收集所有符合命名规则的文件 target_files = [] # 用正则精准匹配文件名格式,提取中间的蛋白ID,同时兼容大小写 filename_pattern = re.compile(r'^AF-([A-Z0-9]+)-F1-model_v4\.pdb$', re.IGNORECASE) for filename in os.listdir(directory): match_result = filename_pattern.match(filename) if match_result: target_files.append((filename, match_result.group(1))) # 批量执行重命名 for old_filename, protein_id in target_files: old_file_path = os.path.join(directory, old_filename) new_filename = f"{protein_id}.pdb" new_file_path = os.path.join(directory, new_filename) # 处理重复文件名:自动添加编号避免覆盖或报错 counter = 1 while os.path.exists(new_file_path): new_filename = f"{protein_id}_{counter}.pdb" new_file_path = os.path.join(directory, new_filename) counter += 1 try: os.rename(old_file_path, new_file_path) print(f"完成重命名: {old_filename} -> {new_filename}") except Exception as e: print(f"重命名失败 {old_filename}: {str(e)}")
脚本改进说明
- 精准的文件名匹配:用正则表达式替代简单的首尾匹配,确保仅匹配完全符合规则的文件,同时兼容大小写差异
- 预收集目标文件:先把所有符合条件的文件收集到列表再统一处理,避免遍历过程中目录变化带来的干扰
- 重复文件名处理:自动为重复的目标文件名添加编号,不会因文件已存在而跳过重命名
- 高效的重命名操作:用
os.rename替代shutil.move,同一目录下重命名更轻量高效
内容的提问来源于stack exchange,提问作者stde
相关产品推荐
相关产品推荐

