1

我正在尝试获取目录中每个音乐文件的“标题”和“艺术家”,以便我可以使用它。我是新手,所以我正在使用这些家伙代码:http ://www.diveintopython.net/object_orient_framework/index.html

对,所以我得到了以下输出。使用我的精英图像处理技能,我指出了我想要保留的数据:

输出

使用以下代码:

 if __name__ == "__main__":
  for info in listDirectory("/home/alpha/htdocs/music/", [".mp3"]):
      for song in info.items():
              print song[1]

完整代码:

import os
import sys
from UserDict import UserDict

def stripnulls(data):
    "strip whitespace and nulls"
    return data.replace("\00", "").strip()

class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)
        self["name"] = filename

class MP3FileInfo(FileInfo):
    "store ID3v1.0 MP3 tags"
    tagDataMap = {"title"   : (  3,  33, stripnulls),
                  "artist"  : ( 33,  63, stripnulls),
                  "album"   : ( 63,  93, stripnulls),
                  "year"    : ( 93,  97, stripnulls),
                  "comment" : ( 97, 126, stripnulls),
                  "genre"   : (127, 128, ord)}

    def __parse(self, filename):
        "parse ID3v1.0 tags from MP3 file"
        self.clear()
        try:                               
            fsock = open(filename, "rb", 0)
            try:                           
                fsock.seek(-128, 2)        
                tagdata = fsock.read(128)  
            finally:                       
                fsock.close()              
            if tagdata[:3] == "TAG":
                for tag, (start, end, parseFunc) in self.tagDataMap.items():
                    self[tag] = parseFunc(tagdata[start:end])               
        except IOError:                    
            pass                           

    def __setitem__(self, key, item):
        if key == "name" and item:
            self.__parse(item)
        FileInfo.__setitem__(self, key, item)

def listDirectory(directory, fileExtList):                                        
    "get list of file info objects for files of particular extensions"
    fileList = [os.path.normcase(f)
                for f in os.listdir(directory)]           
    fileList = [os.path.join(directory, f) 
               for f in fileList
                if os.path.splitext(f)[1] in fileExtList] 
    def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):      
        "get file info class from filename extension"                             
        subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]       
        return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
    return [getFileInfoClass(f)(f) for f in fileList]                             

if __name__ == "__main__":
    for info in listDirectory("/music/_singles/", [".mp3"]): 
        print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
        print

但在那之后我被困住了,因为我不知道下一步该做什么。有人可以帮我吗?

4

3 回答 3

3

你可能最好使用像Mutagen这样的库。

import mutagen, mutagen.mp3, mutagen.easyid3

mp3 = mutagen.mp3.MP3(file, ID3=mutagen.easyid3.EasyID3)
print mp3['artist'], mp3['album'], mp3['title']

Mutagen 相对于 MP3FileInfo 的一个好处是支持 ID3v2。您只是在阅读旧的、简单的 ID3v1 标签。Mutagen 解析所有标准 ID3v2.4 帧。

于 2012-12-16T23:25:28.190 回答
2

如果您在 info 中获得了该数据,那么只需通过以下方式访问您想要的内容:

info['artist']
info['album']

等等......你的映射中的任何东西

于 2012-12-16T23:28:22.037 回答
0

在你的主循环中,info是一个字典,你可以看到在类中定义的tagDataMapMP3FileInfo。所以修改你的原始代码:

if __name__ == "__main__":
    for info in listDirectory("/music/_singles/", [".mp3"]): 
        print "\n".join(["%s=%s" % (k, info[k]) for k in ("title", "artist")])
        print
于 2012-12-16T23:29:16.877 回答