
本文详解如何在 eyed3 中正确创建和写入 mp3 文件的评论字段(comments),尤其适用于清空元数据后从零添加评论的场景,涵盖基础用法、多评论设置及注意事项。
在使用 eyed3 批量处理 MP3 元数据时,许多开发者会调用 tag.clear() 清空所有标签以避免残留信息干扰。然而,与 title、artist 等直属性不同,comments 是一个可变容器对象(CommentsAccessor 实例),不支持直接赋值(如 tag.comments = "xxx"),也不能通过 tag.comments.text = ... 设置——这正是初学者常遇到的“comments is None”或“AttributeError”根源。
✅ 正确做法是:先确保 tag 已初始化(clear() 后需显式访问 tag.comments 触发内部初始化),再调用其 .set() 方法添加评论。
基础用法:添加默认评论
import eyed3
FILE_PATH = "song.mp3"
mp3 = eyed3.load(FILE_PATH)
# 清空原有标签(含 comments)
mp3.tag.clear()
# 关键步骤:获取 comments 访问器(自动初始化 tag 若为空)
comments = mp3.tag.comments
# 添加一条无描述的通用评论(等价于 ID3v2 的 default comment frame)
comments.set("这是我的新评论")
mp3.tag.save()执行后,该评论将作为主评论(Comment 字段)写入 ID3v2 标签,在播放器或 MediaInfo 中显示为 Comment: 这是我的新评论。
进阶用法:按描述(description)添加多条结构化评论
ID3v2 支持为同一文件添加多个带描述的评论(例如区分“Genre”、“year”、“Notes”等上下文)。comments.set() 支持双参数签名:
comments.set(text: str, description: str = "")
示例:
comments.set("贝多芬《第九交响曲》首演年份", "year")
comments.set("古典音乐", "Genre")
comments.set("录音修复版,降噪处理", "Notes")此时,每条评论会以 description 为键独立存储。读取时可通过遍历获取全部内容:
for c in mp3.tag.comments:
print(f"[{c.description or 'default'}]: {c.text}")
# 输出:
# [default]: 这是我的新评论
# [year]: 贝多芬《第九交响曲》首演年份
# [Genre]: 古典音乐
# [Notes]: 录音修复版,降噪处理⚠️ 注意事项与常见陷阱
- tag.clear() 后必须重新获取 comments 对象:clear() 会重置整个 tag,tag.comments 初始为 None,需主动访问一次(如 mp3.tag.comments)才能触发内部初始化并返回有效 CommentsAccessor。
- 不要尝试 comments.append() 或直接赋值:CommentsAccessor 不支持列表操作,仅提供 .set() 接口。
- 中文兼容性:eyed3 默认使用 UTF-8 编码,中文评论无需额外编码处理,但请确保 Python 源文件本身以 UTF-8 保存。
- 版本提示:本文基于 eyed3>=0.9.7(主流稳定版)。若使用旧版(如 0.7.x),API 可能略有差异,请优先升级:pip install --upgrade eyed3。
掌握这一模式后,你即可在批量标准化 MP3 元数据流程中,安全、精准地注入任意数量的结构化评论,彻底解决“清空后无法写入 comments”的核心痛点。










