<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            第 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
            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线