You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过.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")

代码说明

  1. 一次性读取文本文件内的所有新名称,避免循环内重复IO操作
  2. 筛选目录内的.mp4文件并排序,确保和文本文件的条目顺序一一对应(原有文件名按数字命名,排序后即可匹配文本行顺序)
  3. 先校验文件数量是否一致,防止出现错位重命名的问题
  4. 拼接新文件名时保留原文件的.mp4后缀,保证文件格式正确

内容的提问来源于stack exchange,提问作者Khawar Islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:33:18