⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileinfo.py

📁 Dive into Python 中文版
💻 PY
字号:
"""Framework for getting filetype-specific metadata.Instantiate appropriate class with filename.  Returned object acts like adictionary, 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()])Or use listDirectory function to get info on all files in a directory.    for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):        ...Framework can be extended by adding classes for particular file types, e.g.HTMLFileInfo, MPGFileInfo, DOCFileInfo.  Each class is completely responsible forparsing its files appropriately; see MP3FileInfo for example.This program is part of "Dive Into Python", a free Python book forexperienced programmers.  Visit http://diveintopython.org/ for thelatest version."""__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 osimport sysfrom UserDict import UserDictdef 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -