用脚本批量重命名音乐文件

wen 实用脚本 3

用脚本批量重命名,告别手动整理的无尽循环

目录导读

  1. 为什么你需要批量重命名脚本 —— 从手动整理的痛点说起
  2. 主流方案对比 —— Python、PowerShell、批处理与专用工具
  3. Python脚本实战 —— 从零编写一个安全的重命名器
  4. 高级技巧与安全策略 —— 如何避免“改名灾难”
  5. 常见问题速查(FAQ) —— 解决你动手时的卡壳点

为什么你需要批量重命名脚本?

你是否有过这样的经历:下载了300首音乐,文件名却是Track01.mp3audio_2024_0523_112233.mp3,甚至是一串乱码,手动在资源管理器里按F2一个一个改?当你面对第二个100首时,内心只剩崩溃。

用脚本批量重命名音乐文件

更棘手的是,这些文件往往还带着错误的标签信息(ID3),导致你在车载播放器或手机上看到的歌名、歌手全部错位,传统的手动重命名不仅耗时,而且极易出错——尤其是当你需要同时调整文件名的序号格式、去除特殊字符、或者从文件内嵌的元数据(如歌手、专辑)提取信息来构造新文件名时,人类的手速跟反应力完全跟不上。

批量脚本重命名的核心价值在于:一次编写,永久复用,并且可预测、可回滚,这正是它优于手动操作和其他“傻瓜式”软件的地方。

主流方案对比:选对趁手的“武器”

方案 适用人群 优点 缺点
Python (mutagen / eyed3 + os) 进阶玩家、有编程基础者 最灵活,可深度读取音频元数据,跨平台 需安装Python环境,学习曲线稍陡
PowerShell 脚本 Windows 系统重度用户 无需额外安装,原生支持正则,适合简单批量 语法对新手不友好,处理复杂元数据需额外库
CMD 批处理 (ren) 极简需求 最轻量 功能太弱,不支持递归和正则,极易出错
专用GUI工具 (如 Advanced Renamer, MP3Tag) 零基础用户 可视化操作,所见即所得,内置规则 无法完全自动化,处理超大文件夹时速度较慢

我的建议:如果你愿意花20分钟学习基础Python,那它将为你打开一扇通往文件自动化管理的大门,本篇文章着重讲解Python方案

Python脚本实战:写一个带“后悔药”的重命名器

下面是一个经过优化的脚本,它不只做简单的替换,而是从音频文件的元数据中读取信息来生成新文件名,这比傻乎乎地替换字符串要高阶得多。

前置准备:安装必要库

pip install mutagen

完整脚本示例(保存为 rename_music.py):

import os
import re
from mutagen.mp3 import MP3
from mutagen.flac import FLAC
from mutagen.easyid3 import EasyID3
def get_audio_info(file_path):
    """提取歌手和曲名,兼容mp3和flac"""
    try:
        if file_path.endswith('.mp3'):
            audio = EasyID3(file_path)
            artist = audio.get('artist', ['未知歌手'])[0].replace('/', '_')
            title = audio.get('title', [os.path.splitext(os.path.basename(file_path))[0]])[0]
        elif file_path.endswith('.flac'):
            audio = FLAC(file_path)
            artist = audio.get('artist', ['未知歌手'])[0].replace('/', '_')
            title = audio.get('title', [os.path.splitext(os.path.basename(file_path))[0]])[0]
        else:
            return None
        # 清洗非法字符
        artist = re.sub(r'[\\\\/:*?"<>|]', '_', artist).strip()
        title = re.sub(r'[\\\\/:*?"<>|]', '_', title).strip()
        return f"{artist} - {title}.{file_path.split('.')[-1]}"
    except Exception as e:
        print(f"读取失败 {file_path}: {e}")
        return None
def batch_rename(folder_path, dry_run=True):
    """dry_run=True 时只预览不实际改名,强烈建议先试运行"""
    count = 0
    for root, dirs, files in os.walk(folder_path):
        for filename in files:
            if not filename.lower().endswith(('.mp3', '.flac')):
                continue
            old_path = os.path.join(root, filename)
            new_name = get_audio_info(old_path)
            if new_name and new_name != filename:
                new_path = os.path.join(root, new_name)
                # 处理重名冲突:自动添加序号
                serial = 1
                while os.path.exists(new_path) and new_path.lower() != old_path.lower():
                    base, ext = os.path.splitext(new_name)
                    new_path = os.path.join(root, f"{base}_{serial}{ext}")
                    serial += 1
                if dry_run:
                    print(f"[预览] {filename} -> {os.path.basename(new_path)}")
                else:
                    os.rename(old_path, new_path)
                    print(f"[执行] {filename} -> {os.path.basename(new_path)}")
                count += 1
    print(f"共处理 {count} 个文件。")
    if dry_run:
        print("当前为试运行模式,确认无误后将 dry_run=False 执行实际修改。")
if __name__ == "__main__":
    # 修改为你的音乐目录
    batch_rename(r"D:\我的音乐", dry_run=True)  # 先预览

高级技巧与安全策略:别让脚本毁了你的歌单

  1. 永远先开启 dry_run(预览):这能让你在不碰文件的情况下,确认输出结果是否符合预期。
  2. 备份文件清单:在执行前,运行 dir /b /s > 文件列表.txt(Windows)或 find . -type f > 列表.txt(macOS/Linux)记录原始文件名,一旦出错,可以对照恢复。
  3. 处理特殊字符:音乐文件名中常见的花括号、方括号或非UTF-8字符,建议在脚本中用正则剥离。
  4. 不要在生产环境盲目使用 os.walk 递归:如果你的音乐库有几十层子目录,且有些目录权限受限,确保脚本加入了异常捕获(如上面的 try-except)。

常见问题速查(FAQ)

Q1:我的歌都是数字编号(01.mp3),没有任何元数据标签,脚本没用怎么办? A:这种情况只能按文件名规则处理,你可以用 sorted(os.listdir()) 排序,然后通过序号与给定歌单列表进行 zip 匹配重命名,但前提是你得有一个外部映射表。

Q2:执行脚本时报错 PermissionError: [WinError 32] A:这通常是因为文件正在被播放器(如 Windows Media Player、iTunes)占用,确保关闭所有音乐播放器后再执行脚本。

Q3:如何把 歌手 - 歌曲.mp3 这种格式拆分并重新组合? A:使用正则 r'^\d+\.\s*(.*?)\s*-\s*(.*?)\.mp3$' 匹配,然后重新拼接成 歌手 - 歌曲.mp3,核心思路是“先抓结构,再重组”。

Q4:有没有办法让脚本自动下载封面? A:那是另一个领域(获取专辑封面API),与重命名无关,建议先整理好文件名,再用 MusicBrainz Picard 之类的软件去自动挂载封面,效果更好。

Q5:PowerShell 能一行命令搞定吗? A:可以,例如去除文件名中的“【广告】”字样:

Get-ChildItem -Recurse -Filter *.mp3 | Rename-Item -NewName { $_.Name -replace '【广告】', '' }

但这对提取元数据无效,且无法应对复杂的重复冲突。


行动提示:将上述脚本复制到你的 Python 环境中,先运行 dry_run=True 预览结果,当你看到「D:\音乐\夏奇拉 - 难以抗拒.mp3」这样整洁的名字时,你会觉得前10分钟的学习成本,值回票价,请根据你的实际需求调整关键词(如“批量重命名音乐文件”)和路径,让你的音乐库从此井井有条。

抱歉,评论功能暂时关闭!