【问题标题】:Manipulating .mp3 metadata with Python in Windows 7在 Windows 7 中使用 Python 处理 .mp3 元数据
【发布时间】:2012-01-09 19:24:16
【问题描述】:

我正在尝试通过 Python 编辑某些 MP3 文件 ID3 标记。我做了一些研究,发现了诱变剂和 eyeD3 库。但是,我在这两个库中都遇到了类似的问题。两种实现都抱怨我提供的文件不存在,或者不是 .mp3 文件。

我已经下载了 Mp3tag (http://www.mp3tag.de/en/download.html) 并确认我提供的文件被标记为 ID3v2.3(ID3v1 ID3v2.3) 并且是一个 .mp3文件。

下面是诱变剂代码,后面是我收到的错误:

from mutagen.mp3 import MP3

audio = MP3("C:\Users\557319\Music\Trance\Paul van Dyk - We Come Together (Arty Remix)")
print audio.info.length, audio.info.bitrate

Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    audio = MP3("C:\Users\557319\Music\Trance\Paul van Dyk - We Come Together (Arty Remix)  www.freshnewtracks.com.mp3")
  File "C:\Python27\lib\site-packages\mutagen\__init__.py", line 75, in __init__
    self.load(filename, *args, **kwargs)
  File "C:\Python27\lib\site-packages\mutagen\id3.py", line 1995, in load
    try: self.tags = ID3(filename, **kwargs)
  File "C:\Python27\lib\site-packages\mutagen\id3.py", line 74, in __init__
super(ID3, self).__init__(*args, **kwargs)
  File "C:\Python27\lib\site-packages\mutagen\_util.py", line 105, in __init__
    super(DictProxy, self).__init__(*args, **kwargs)
  File "C:\Python27\lib\site-packages\mutagen\__init__.py", line 39, in __init__
    self.load(*args, **kwargs)
  File "C:\Python27\lib\site-packages\mutagen\id3.py", line 109, in load
    self.__fileobj = file(filename, 'rb')
IOError: [Errno 2] No such file or directory: 'C:\\Userso319\\Music\\Trance\\Paul van Dyk - We Come Together (Arty Remix) www.freshnewtracks.com.mp3'

现在,当我尝试使用 eyeD3 查看 ID3 数据时,我遇到以下情况:

import eyeD3

trackInfo = eyeD3.Mp3AudioFile("C:\Users\557319\Music\Trance\Paul van Dyk - We Come Together (Arty Remix) www.freshnewtracks.com")

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
trackInfo = eyeD3.Mp3AudioFile("C:\Users\557319\Music\Trance\Paul van Dyk - We Come Together (Arty Remix) www.freshnewtracks.com")
  File "C:\Python27\lib\site-packages\eyeD3\tag.py", line 1618, in __init__
    raise InvalidAudioFormatException("File is not mp3");
InvalidAudioFormatException: File is not mp3

我的猜测是我没有正确查看文件?我是否需要使用某种类型的 os 库来正确查看 Windows 7 的这些文件 ID3 数据?非常感谢任何帮助。

谢谢。

【问题讨论】:

  • \ 是 python 转义字符。您需要在文件名中包含两个 \ 或执行 r'C:\Users\557319...`

标签: python mp3 mutagen


【解决方案1】:

当您在 Python 中处理 Windows 路径时,您有三种选择:

  • 用一个额外的反斜杠转义所有反斜杠 ("C:\\mydir\\myfile.mp3")
  • 将其指定为“原始”字符串(r'C:\mydir\myfile.mp3' -- 注意开头的“r”)
  • 使用正斜杠。有些库可能不喜欢它。

无论何时操作路径,都应始终使用 os.path 模块中的函数,例如os.path.join(r'C:\mydir','myfile.mp3')

(顺便说一句,请注意,像 mutagen 这样的 ID3 库以漏洞百出和喜怒无常而著称,因此预计会出现损坏或奇怪的行为;不幸的是,这是因为 ID3 是一个规范不明确的非标准,充满了极端情况和奇怪的实现.)

【讨论】:

  • 我强烈建议您使用read up about Mutagen,因为它是目前最强大的 ID3 库之一。它和 Python 一样,只是想在尝试对文件执行任何操作之前确保文件存在。
  • 抱歉,我不想贬低诱变剂 :) 这只是关于 ID3 操作库的旁白。绝大多数人都非常挑剔;甚至 mutagen 也明确表示他们的目标只是 iTunes,因为做更多的事情根本不值得——总会有某种奇怪的玩家以不同的方式解释标准。当然与具体问题无关:)
【解决方案2】:

我的建议是不要乱用反斜杠。 Windows 中的 Python 将接受带有正斜杠的路径。

接下来,不要忘记文件的 .mp3 扩展名。 Mutagen/Python 非常特别关注文件的确切位置。如果您不确定文件名或扩展名可能是什么,请随时在交互式 shell 中使用以下代码 sn-p 进行检查:

import os
os.listdir('C:/Userso319/Music/Trance/')

这将显示该目录中所有文件的列表以及结尾扩展名。

因此,您的新路径变为(如果这是文件的实际名称):

"C:/Users/557319/Music/Trance/Paul van Dyk - We Come Together (Arty Remix) www.freshnewtracks.com.mp3"

【讨论】:

  • C:\Users\557319\Music\Trance\Paul van Dyk - We Come Together (Arty Remix) www.freshnewtracks.com.mp3
  • 如果这是完整路径,那么您将使用它来创建 MP3() 对象。不要忘记扩展名!
【解决方案3】:

这是 Windows 的问题(虽然不是真正的 Windows 故障)。 将这些行添加到代码的顶部,它将报告正确的 mime 类型。

import mimetypes
mimetypes.init([])

更多信息请见http://bugs.python.org/issue10551

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多