【Python实用技巧】如何批量修改歌曲信息

这篇具有很好参考价值的文章主要介绍了【Python实用技巧】如何批量修改歌曲信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 背景

最近朋友说有个问题比较苦恼,手里有一批歌曲文件要整理归档,但是很多歌曲文件的属性信息不全,手动点开文件属性一个个进行修改太折磨人了。有没什么办法可以批量进行修改?
【Python实用技巧】如何批量修改歌曲信息
朋友有难,自然是要赴汤蹈火的,当时就夸下了海口,放心包在我身上,一定帮你找到解决办法。

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 row
    for 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 = title
                    if artist:
                        audio_file.tag.artist = artist
                    if album:
                        audio_file.tag.album = album
                    if genre:
                        audio_file.tag.genre = genre
                    if year:
                        audio_file.tag.year = year
					# 保存修改后的 MP3 文件
                    audio_file.tag.save()
4.4 增加打印提示

以上代码实现了需求的功能,但是没有任何输出,也不知道修改成功了没。于是增加了一些信息的输出,并加上条件判断统计修改成功与失败的数量:

print("正在更新歌曲属性信息……")

updated_count = 0
failed_count = 0

with open("music.csv", "r", encoding="gbk") as f:
    reader = csv.reader(f)
    next(reader) # skip header row
    for 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 = title
                    if artist:
                        audio_file.tag.artist = artist
                    if album:
                        audio_file.tag.album = album
                    if album_artist:
                        audio_file.tag.album_artist = album_artist
                    if genre:
                        audio_file.tag.genre = genre
                    if year:
                        audio_file.tag.year = year
                    # 保存修改后的 MP3 文件
                    audio_file.tag.save()
                    updated_count += 1
                    print(f"成功更新歌曲{filename}的属性信息")
                else:
                    failed_count += 1
                    print(f"歌曲{filename}没有标签信息,无法更新属性")
            except:
                failed_count += 1
                print(f"歌曲{filename}没有标签信息,无法更新属性")
        else:
            failed_count += 1
            print(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.title
                        artist = audio.tag.artist
                        album = audio.tag.album
                        genre = audio.tag.genre                  
                        year = audio.tag.getBestDate().year
                except 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等实现图形化的操作界面。

更多的优化待有空继续……文章来源地址https://www.toymoban.com/news/detail-488796.html

到了这里,关于【Python实用技巧】如何批量修改歌曲信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实用技巧:排查数据异常/数据波动问题,该如何下手?

    在我做开发的这些年,让我很头痛的一类问题,不是线上故障,而是数据异常,不知道有没有程序员跟我感同身受。 大多数的服务故障都有较为直观的异常日志,再结合产品表象,相对排查起来还有迹可循,但数据异常的原因就太多了,很多时候连报错日志都没有,排查起来

    2024年04月12日
    浏览(43)
  • 10个超级实用的Python技巧

    人生苦短,我学Python。离不开它自带的“buff”。 - 简单好用 Python的优势很多,最明显的便是简单、易上手。Python的语法非常简单,比如敲“Hello World”,用其他编程语言要敲6-7行代码,用Python只需要1行代码,让新手也能够轻松上手。 - 丰富的标准库 Python拥有的丰富标准库,

    2023年04月09日
    浏览(41)
  • Python实用技巧:将 Excel转为PDF

    将Excel文件转换为PDF可以方便储存表格数据,此外在打印或共享文档时也能确保表格样式布局等在不同设备和操作系统上保持一致。今天给大家分享一个使用第三方Python库Spire.XLS for Python 实现Excel转PDF的简单方法。 1. 首先,通过pip命令来安装依赖库; 2. 安装完成后,导入所需

    2024年02月05日
    浏览(72)
  • 实用技巧:如何在 Postman Runner 中实现参数自增

    Postman Runner 是 Postman 工具中的一个强大功能,它可以用来批量运行 API 测试脚本。通过设置不同的参数组合,我们可以轻松地测试 API 的各种不同情况,并生成测试报告和测试结果。 在使用 Postman Runner 运行测试脚本时,我们需要设置一个全局参数 counter 。接下来,我们将会通

    2024年02月03日
    浏览(45)
  • HTTP代理编程:Python实用技巧与代码实例

    今天我要与大家分享一些关于HTTP代理编程的实用技巧和Python代码实例。作为一名HTTP代理产品供应商,希望通过这篇文章,帮助你们掌握一些高效且实用的编程技巧,提高开发和使用HTTP代理产品的能力。 一、使用Python的requests库发送HTTP请求: Python的requests库是一个强大而简便

    2024年02月13日
    浏览(47)
  • vscode中如何快速生成vue3模板-非常实用的小技巧

    在vue项目开发过程中,我们会发现我们每次新建一个vue组件文件的时候,都需要写一些重复的代码,比如下面代码: 在vscode编辑器中,那有没有什么办法能够让我们快速生成这样的模板呢,答案是有的! 如果觉得对你有帮助的话还望点个赞 + 收藏一下,希望能够帮助到更多

    2024年02月15日
    浏览(61)
  • python实战应用讲解-【numpy数组篇】实用小技巧(五)(附python示例代码)

    目录   查找两个NumPy数组的并集 查找NumPy数组中的唯一行 扁平化 一个NumPy数组的列表 使用NumPy在Python中扁平化一个矩阵 从元素上获取NumPy数组值的幂 为了找到两个一维数组的联合,我们可以使用Python Numpy库的函数numpy.union1d()。它返回唯一的、经过排序的数组,其值在两个输

    2023年04月14日
    浏览(44)
  • python实战应用讲解-【numpy数组篇】实用小技巧(八)(附python示例代码)

    目录   如何在NumPy数组上映射一个函数 方法一:numpy.vectorize()方法 方法2:使用lambda函数 方法3:用一个数组作为函数的参数来映射一个NumPy数组 如何使用给定的索引位置重新排列二维NumPy数组的列 如何用NumPy删除只包含0的数组行 如何删除Numpy数组中包含非数字值的列

    2024年02月01日
    浏览(49)
  • Win11的两个实用技巧系列之如何关闭文字热门搜索、任务栏上的应用

    目录 in10和Win11 22H2如何关闭文字热门搜索? Win11 22H2关闭文字热门搜索 Win10 22H2关闭文字热门搜索 Win11中如何不用鼠标打开已固定在任务栏上的应用 鼠标的操作方式如下: 点击拿去 不管是Win10还是Win11,打开Windows搜索,都会有以文字显示的热门搜索或推荐内容,很多朋友想要关

    2024年02月05日
    浏览(43)
  • 轻松驾驭Python格式化:5个F-String实用技巧分享

    F-String (格式化字符串字面值)是在Python 3.6中引入的,它是一种非常强大且灵活的字符串格式化方法。 它允许你在字符串中嵌入表达式,这些表达式在运行时会被求值并转换为字符串, 这种特性使得 F-String 在编写 Python 代码时能够更简洁、更直观地处理字符串。 本文总结了

    2024年03月12日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包