我遇到了这个Python代码的麻烦..它应该给我类似于此处显示的输出(对于不同的音乐文件应该有所不同):
album= artist=Ghost in the Machine title=A Time Long Forgotten (Concept genre=31 name=/music/_singles/a_time_long_forgotten_con.mp3 year=1999 comment=http://mp3.com/ghostmachine
但反过来给了我以下内容:
name = derp/whoshotya.mp3
这是给我的代码(稍微修改以适应我正在使用的音乐样本)在Dive Into Python的第5章中,可以找到here:
"""Framework for getting filetype-specific metadata.
Instantiate appropriate class with filename. Returned object acts like a dictionary, with key-value pairs for each piece of metadata.
import fileinfo
info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3")
print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()])
或使用listDirectory函数获取目录中所有文件的信息。
for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):
...
可以通过添加特定文件类型的类来扩展框架,例如 HTMLFileInfo,MPGFileInfo,DOCFileInfo。每个班级都完全负责 适当地解析它的文件;例如,参见MP3FileInfo。
这个程序是“Dive Into Python”的一部分,这是一本免费的Python书籍 有经验的程序员。访问http://diveintopython.net/了解相关信息 最新版本。
"""
__author__ = "Mark Pilgrim (mark@diveintopython.org)"
__version__ = "$Revision: 1.3 $"
__date__ = "$Date: 2004/05/05 21:57:19 $"
__copyright__ = "Copyright (c) 2001 Mark Pilgrim"
__license__ = "Python"
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("derp/", [".mp3"]):
print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
print
答案 0 :(得分:0)
我认为问题可能在这里:
if __name__ == "__main__":
for info in listDirectory("derp/", [".mp3"]):
print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
print
我的想法是,有问题的文件(info
)没有像示例那样填充所有文件标签。这就是为什么它只显示名称字段。尝试手动更改文件标签(通过右键单击文件并转到属性)并再次运行该功能。
编辑: 我不确定你的代码到底发生了什么,但我有一个理论。
class MP3FileInfo(FileInfo):
...
def __setitem__(self, key, item):
if key == "name" and item:
self.__parse(item)
FileInfo.__setitem__(self, key, item)
这部分令我困惑。这到底发生了什么?看起来你想要将解析后的数据添加到FileInfo对象中,不是吗?这个函数从哪里调用?并且关键是除了“名字”以外的其他任何东西,因为这可能是你的问题。