Python论坛  - 讨论区

标题:[python-chinese] DiveIntoPython例程不解!

2007年01月30日 星期二 16:02

zhbguan zhbguan在lemote.com
星期二 一月 30 16:02:50 HKT 2007

DiveIntoPython5.4ÖУ¬ÆäÖÐÒ»¸öÀý³ÌΪfileinfo.py£º

"""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()])

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 for
parsing its files appropriately; see MP3FileInfo for example.
"""
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   ###´Ë´¦MP3FileInfoµÄÒ»¸öʵÀýµ÷ÓÃÁ˸¸ÀàFileInfoµÄ__int__º¯Êý£¬
                                  ###µ«ÊÇ£¬self["name"] = filenameÔõô»áµ÷ÓÃMP3FileInfoÀàµÄ__setitem__º¯ÊýÄØ£¿£¿
                                  ###´Ë´¦ÎÒÖªµÀ£¬__setitem__ÊÇרÓú¯Êý£¬Ò²¾ÍÊÇ˵£¬Èç¹û³öÏÖ¸³ÖµµÄÇé¿ö£¬ÏµÍ³»á×Ô¶¯µ÷ÓÃÕâ¸öº¯ÊýµÄ¡£
                                  ###ÎÒµÄÎÊÌâÊÇ£º¾ÍÊǵ÷ÓõĻ°£¬Ò²Ó¦¸Ãµ÷ÓÃFileInfoµÄ__setitem__º¯Êý°É£¿£¿´Ë´¦selfÊÇÖ¸ÄǸöʵÀý¶ÔÏó°¡£¿
                                  ###ÊÇÖ¸MP3FileInfoµÄʵÀý¶ÔÏóô£¿£¿£¿

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
ÎÊÌâ²Î¼ûÉÏÊö×¢ÊÍ£¡£¡£¡

¶àл£¡£¡¶àл£¡£¡£¡




zhbguan
2007-01-30
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070130/c03111c5/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号