1

ディレクトリ内のすべての音楽ファイルの「タイトル」と「アーティスト」を取得しようとしているので、それを詰め込むことができます。私は初心者なので、この人のコードを使用しています: http://www.diveintopython.net/object_directional_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']

MP3FileInfo に対する Mutagen の利点の 1 つは、ID3v2 のサポートです。古い単純な ID3v1 タグを読んでいるだけです。Mutagen は、すべての標準 ID3v2.4 フレームを解析します。

于 2012-12-16T23:25:28.190 に答える
2

情報にそのデータがある場合は、次の方法で必要なものにアクセスしてください。

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 に答える