【Python实用技巧】如何批量修改歌曲信息
目录
- 1 背景
- 2 思路分析
- 2.1 如何修改歌曲属性信息
- 2.1.1 可以用于修改歌曲的属性信息的库
- 2.1.2 使用EyeD3修改歌曲属性
- 2.2 歌曲属性信息获取
- 2.1.1 使用CSV文件维护歌曲信息
- 2.3 整体流程
- 3 EyeD3库的安装
- 4 代码实现
- 4.1 导入模块
- 4.2 读取csv文件获取需要修改的信息:
- 4.3 修改歌曲属性信息:
- 4.4 增加打印提示
- 5 进一步完善
- 5.1 遍历当前路径下的歌曲文件,并获取歌曲信息
- 5.2 把获取到的歌曲信息写入的到music.csv中
- 未完待续:
1 背景
最近朋友说有个问题比较苦恼,手里有一批歌曲文件要整理归档,但是很多歌曲文件的属性信息不全,手动点开文件属性一个个进行修改太折磨人了。有没什么办法可以批量进行修改?

朋友有难,自然是要赴汤蹈火的,当时就夸下了海口,放心包在我身上,一定帮你找到解决办法。
2 思路分析
既然可以手动修改,那么必然肯定有办法通过脚本的方式进行批量修改,这里是不是可以通过Python来批量修改文件的属性呢?
2.1 如何修改歌曲属性信息
2.1.1 可以用于修改歌曲的属性信息的库
Mutagen: Mutagen是Python的一个音频元数据处理库,可以读取、编辑、写入常见的音频格式(如MP3、FLAC、OGG、WAV等)的元数据。可以使用它来修改歌曲的属性信息,如标题、艺术家、专辑、曲目号等等。
EyeD3: EyeD3是一个用于读取和编辑ID3标签的Python库,支持MP3和OGG格式的音频文件。使用它可以读取和编辑歌曲的标题、艺术家、专辑、流派、年份、曲目号等元数据信息。
pydub: pydub是一个用于处理音频文件的Python库,支持多种格式,包括MP3、WAV、FLAC、AIFF等等。可以使用pydub读取歌曲的元数据,同时也可以使用它来剪辑、混音、降噪等。
audioread: audioread是一个用于读取音频文件的Python库,支持多种格式,包括MP3、WAV、FLAC等等。它可以用来读取歌曲的元数据信息,但不支持写入元数据。
2.1.2 使用EyeD3修改歌曲属性
这里选择使用EyeD3修改歌舞的属性信息,常用的属性参数修改方法如下:
# 修改标题
audio_file.tag.title = "New Title"
# 修改艺术家
audio_file.tag.artist = "New Artist"
# 修改专辑
audio_file.tag.album = "New Album"
# 修改流派
audio_file.tag.genre = "New Genre"
# 修改年份
audio_file.tag.year = "2022"
2.2 歌曲属性信息获取
2.1.1 使用CSV文件维护歌曲信息
需要更新歌取属性信息那么得有一个载体记录需要更新的属性信息,这里选择使用CSV文件进行歌曲信息的维护。
新建一个music.csv文件,将需要维护的信息录入进去。表头如下:
| 文件名 | 标题 | 艺术家 | 专辑 | 流派 | 年份 |
|---|---|---|---|---|---|
2.3 整体流程
首先,手动创建CSV文件,录入需要更新的歌曲属性,再通过Python读取CSV文件获取歌曲属性,批量写入到歌曲中。
3 EyeD3库的安装
要使用EyeD3库来修改歌曲的属性信息,需要先安装该库。可以使用以下命令在终端或命令行中安装EyeD3::
pip install eyeD3
4 代码实现
4.1 导入模块
导入需要使用的模块:
import os
import csv
import tkinter as tk
from datetime import datetime
import eyed3
4.2 读取csv文件获取需要修改的信息:
with open("music.csv", "r", encoding="gbk") as f:reader = csv.reader(f)next(reader) # skip header rowfor row in reader:filename, title, artist, album, genre, year = row
4.3 修改歌曲属性信息:
读取本地歌曲文件,与filename列进行匹配,如果匹配上了则修改歌曲属性信息:
# 获取当前路径下歌曲文件信息filepath = os.path.join(".", filename)if os.path.exists(filepath):try:# 使用 eyed3 库读取 MP3 文件audio_file = eyed3.load(filepath)# 如果 MP3 文件有标签if audio_file.tag:# 如果 music.csv 文件中的某个属性有值,则将该属性值更新到 MP3 文件标签中if title:audio_file.tag.title = titleif artist:audio_file.tag.artist = artistif album:audio_file.tag.album = albumif genre:audio_file.tag.genre = genreif year:audio_file.tag.year = year# 保存修改后的 MP3 文件audio_file.tag.save()
4.4 增加打印提示
以上代码实现了需求的功能,但是没有任何输出,也不知道修改成功了没。于是增加了一些信息的输出,并加上条件判断统计修改成功与失败的数量:
print("正在更新歌曲属性信息……")updated_count = 0
failed_count = 0with open("music.csv", "r", encoding="gbk") as f:reader = csv.reader(f)next(reader) # skip header rowfor row in reader:filename, title, artist, album, genre, year = row# 获取当前路径下歌曲文件信息filepath = os.path.join(".", filename)if os.path.exists(filepath):try:# 使用 eyed3 库读取 MP3 文件audio_file = eyed3.load(filepath)# 如果 MP3 文件有标签if audio_file.tag:# 如果 music.csv 文件中的某个属性有值,则将该属性值更新到 MP3 文件标签中if title:audio_file.tag.title = titleif artist:audio_file.tag.artist = artistif album:audio_file.tag.album = albumif album_artist:audio_file.tag.album_artist = album_artistif genre:audio_file.tag.genre = genreif year:audio_file.tag.year = year# 保存修改后的 MP3 文件audio_file.tag.save()updated_count += 1print(f"成功更新歌曲{filename}的属性信息")else:failed_count += 1print(f"歌曲{filename}没有标签信息,无法更新属性")except:failed_count += 1print(f"歌曲{filename}没有标签信息,无法更新属性")else:failed_count += 1print(f"文件{filename}不存在,无法更新属性")
print(f"成功更新{updated_count}首歌曲属性,失败{failed_count}首。")
5 进一步完善
考虑的要修改的歌曲数量较大,而且有些歌曲已经存在了部分信息,这里增加一步读取本地的歌曲信息,并写入到csv文件中,根据获取到的信息进行更新,减少工作量。
5.1 遍历当前路径下的歌曲文件,并获取歌曲信息
music_files = []for file in os.listdir():if file.endswith(".mp3"):file_path = os.path.abspath(file)title, artist, album, genre, year = "", "", "", "", ""try:audio = eyed3.load(file_path)if audio.tag:title = audio.tag.titleartist = audio.tag.artistalbum = audio.tag.albumgenre = audio.tag.genre year = audio.tag.getBestDate().yearexcept Exception as e:print(f"获取{file}信息失败:{str(e)}")music_files.append([file, title, artist, album, genre, year])
5.2 把获取到的歌曲信息写入的到music.csv中
with open("music.csv", "w", newline="", encoding="gbk") as f:writer = csv.writer(f)writer.writerow(["文件名", "标题", "艺术家", "专辑", "音乐类型", "年份" ])writer.writerows(music_files)
获取到歌曲信息后就可以去修改music.csv文件的信息,再执行歌曲属性的信息操作了。
未完待续:
以上代码基本实现了批量修改歌曲属性信息的需求,但依然还有可以进一步完善的地方:
- EyeD3库只适用于修改mp3文件,如有其它类型的音频文件时无法修改;
- 以上纯代码操作,对于不懂编程的朋友来说操作运行也还有难度,后续可以通过tkinter等实现图形化的操作界面。
更多的优化待有空继续……
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
