如何通过.txt索引批量重命名目录文件?现有Python代码失效求助
批量重命名文件问题修复
问题描述
我有一个包含大量.mp4视频文件的目录,同时有一个.txt文件,每行对应一个新文件名,目录文件和文本条目各有100个,需要按文本文件内容批量重命名目录内的文件。
文本文件内容
Flower Blue Flower Red Flower Black Flower orange
目录内原有文件
001.mp4 002.mp4 003.mp4 004.mp4
原错误代码
import os import shutil dirpath = "/media/cvpr/CM_22/inst_you/vidoes" for file in os.listdir(dirpath): with open('/media/cvpr/CM_22/inst_you/vidoes_name') as f: lines = [line.rstrip('\n') for line in f] print(file) newfile = os.path.join(dirpath, file.split("_", 1)[1]) print(newfile) os.rename(os.path.join(dirpath, file), newfile)
原代码的问题
- 循环内重复打开文本文件,完全没必要且效率极低
file.split("_", 1)[1]逻辑错误:原有文件名是001.mp4这类无下划线的格式,执行此代码会直接抛出索引错误- 未建立文本行与目录文件的对应关系,根本无法实现按文本内容重命名的需求
修复后的代码
import os dirpath = "/media/cvpr/CM_22/inst_you/vidoes" txt_path = "/media/cvpr/CM_22/inst_you/vidoes_name" # 一次性读取所有新文件名,过滤空行并去除换行符 with open(txt_path, 'r', encoding='utf-8') as f: new_names = [line.strip() for line in f if line.strip()] # 获取目录内所有mp4文件,按名称排序(保证和文本条目顺序对应) video_files = sorted([f for f in os.listdir(dirpath) if f.endswith('.mp4')]) # 先检查文件数量是否匹配,避免出现错位重命名 if len(video_files) != len(new_names): print(f"文件数量不匹配:目录有{len(video_files)}个视频,文本有{len(new_names)}个名称") else: # 批量执行重命名 for old_file, new_name in zip(video_files, new_names): old_path = os.path.join(dirpath, old_file) # 保留原文件的.mp4后缀 new_path = os.path.join(dirpath, f"{new_name}.mp4") os.rename(old_path, new_path) print(f"已重命名:{old_file} -> {new_name}.mp4")
代码说明
- 一次性读取文本文件内的所有新名称,避免循环内重复IO操作
- 筛选目录内的
.mp4文件并排序,确保和文本文件的条目顺序一一对应(原有文件名按数字命名,排序后即可匹配文本行顺序) - 先校验文件数量是否一致,防止出现错位重命名的问题
- 拼接新文件名时保留原文件的
.mp4后缀,保证文件格式正确
内容的提问来源于stack exchange,提问作者Khawar Islam
相关产品推荐
相关产品推荐

