Начало > В глубь языка Python > Средства объектно-ориентированного программирования > Summary | << >> | ||||
В глубь языка Python Для программистов |
The fileinfo.py program should now make perfect sense.
"""Получение метаинформации, специфичной для файла данного типа. Создайте экземпляр соответствующего класса, передав конструктору имя файла. Возвращаемый объект ведет себя аналогично словарю с парами ключ-значение для каждой части метаинформации. import fileinfo info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3") print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()]) Или используйте функцию listDirectory для получения информации обо всех файлов в директории for info in fileinfo.listDirectory("/music/ap/", [".mp3"]): ... Модуль может быть расширен путем доюавления классов для других типов файлов, например HTMLFileInfo, MPGFileInfo, DOCFileInfo. Каждый класс полностью отвечает за анализ файлов соответствующего типа; используйте MP3FileInfo в качестве примера. """ import os import sys from UserDict import UserDict def stripnulls(data): "очищает строку от символов пропуска и нулевых символов" return data.replace("\00", "").strip() class FileInfo(UserDict): "хранит метаинформацию о файле" def __init__(self, filename=None): UserDict.__init__(self) self["name"] = filename class MP3FileInfo(FileInfo): "хранит ID3v1.0 MP3 теги" 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): "анализ ID3v1.0 тегов из MP3 файла" 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): """возвращает список объектов с метаинформацией для всех файлов с указанным расширением""" 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__]): "оределяет класс, предназначеный для обработки файла, по расширению" 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
Before diving into the next chapter, make sure you're comfortable doing all of these things:
Putting it all together | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | GNU Free Documentation License |
Copyright © 2023 Mark Pilgrim, diveintopython.org |