<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    第 5 章 對象和面向對象

    這一章,和此后的許多章,均討論了面向對象的 Python 程序設計。

    5.1. 概覽

    下面是一個完整的,可運行的 Python 程序。請閱讀模塊、類和函數的 doc strings,可以大概了解這個程序所做的事情和工作情況。像平時一樣,不用擔心你不理解的東西,這就是本章其它部分將告訴你的內容。

    例 5.1. 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
    
    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"]): 1
            print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
            print
    1 這個程序的輸入要取決于你硬盤上的文件。為了得到有意義的輸出,你應該修改目錄路徑指向你自已機器上的一個 MP3 文件目錄。

    下面就是從我的機器上得到的輸出。你的輸出將不一樣,除非,由于某些令人吃驚的巧合,你與我有著共同的音樂品味。

    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
    
    album=Rave Mix
    artist=***DJ MARY-JANE***
    title=HELLRAISER****Trance from Hell
    genre=31
    name=/music/_singles/hellraiser.mp3
    year=2000
    comment=http://mp3.com/DJMARYJANE
    
    album=Rave Mix
    artist=***DJ MARY-JANE***
    title=KAIRO****THE BEST GOA
    genre=31
    name=/music/_singles/kairo.mp3
    year=2000
    comment=http://mp3.com/DJMARYJANE
    
    album=Journeys
    artist=Masters of Balance
    title=Long Way Home
    genre=31
    name=/music/_singles/long_way_home1.mp3
    year=2000
    comment=http://mp3.com/MastersofBalan
    
    album=
    artist=The Cynic Project
    title=Sidewinder
    genre=18
    name=/music/_singles/sidewinder.mp3
    year=2000
    comment=http://mp3.com/cynicproject
    
    album=Digitosis@128k
    artist=VXpanded
    title=Spinning
    genre=255
    name=/music/_singles/spinning.mp3
    year=2000
    comment=http://mp3.com/artists/95/vxp
    97av