מתקדם > תכנות מונחה עצמים > מבוא

מבוא 

לפנינו תוכנית מלאה ועובדת בפיתון. קרא/י את מחרוזת התיעוד (doc_string) של המודול, את המחלקות והפונקציות כדי לקבל מושג כללי על מה שהתכנית עושה ואיך היא עובדת. כמו תמיד, אין צורך להיבהל מהחלקים הלא מובנים – הם יוסברו בהמשך הפרק.

"""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 stripnull
s(data):
 
"strip whitespace and nulls"

 
return
data.replace("\00", "").strip()
 

class FileInf
o(UserDict):
 
"store file metadata"

 
def __init_
_(self, filename=None):
   
UserDict.__init__(self)

   
self["name"] = filename

 

class MP3FileInf
o(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 __pars
e(self, filename):
   
"parse ID3v1.0 tags from MP3 file"

   
self.clear()

   
tr
y:
     
fsock = open(filename, "rb", 0)

     
tr
y:
       
fsock.seek(.128, 2)

       
tagdata = fsock.read(128)

     
finall
y:
       
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 listDirector
y(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 getFileInfoClas
s(filename, module=sys.module
[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

 
עמוד ראשי
הקדמה
התקנה
שימוש
התחלה
פונקציות
זרימת התכנית
טיפוסי נתונים
זרימת התכנית - מתקדם
תכנות מונחה עצמים
מודולים
כללי
שלבי הפרויקט
דוגמאות הרצה